Chúng ta thấy rằng tất cả các thông báo kiểu điểm tới điểm (point-to-point) được phân chia và gửi đi theo thư tự, có thể sử dụng nhãn thời gian duy trì liên kết nhân quả. Kết quả là giữ lại thông báo m gửi từ bộ xử lý p cho đến khi chúng ta đảm bảo rằng không có thông báo m’<Hm sẽ được phân chia từ bất cứ bộ xử lý nào. Mỗi một bộ xử lý p giữ một mảng earliest[1…M] cất trong phạm vi thấp nhất trong nhãn thời gian của các thông báo mà có thể được phân chia ra từ các bộ xử lý khác nhau. Mỗi bộ xử lý giữ một mảng các khối hàng đợi thông báo blocked[1…M] và một hàng đợi FIFO cho các thông báo từ mỗi bộ xử lý khác. Giải thuật để phân chia thông báo nhân quả được thấy trong giải thuật dưới đây:
Giải thuật 1: Phân phát thông báo nhân quả Initially,
each earliest[k] is set to the 1k timestamp, k=1…M each bloked[k] is set to {},k=1…M
On the receipt of message m from processor p delivery_list={}
if (blocked[p] is empty)
earliest[p]=m.timestamp Add m to the tail of blocked[p]
while (there is a k such that blocked[k] is not empty), and for every i=1…M, except for k and Seft,
not_earlier(earliest[i],earliest[k],i)) remove the message at the head of blocked[k], put it in delivery_list if blocked[k] is not empty
set earliest[k] to m’.timestamp, where m’ is at the head of blocked[k]
else
increment earliest[k] by 1k
Deliver the message in delivery_list, in causal order
Nhãn thời gian của thông báo sớm nhất có thể được phân chia từ bộ xử lý k được nạp trong earliest[k]. Biến earliest[k] được bắt đầu từ lk là nhãn thời gian nhỏ nhất mà bộ xử lý pk có thể được gắn vào một thông báo. Khi một bộ xử lý nhận thông báo m từ bộ xử lý p, thông báo được đặt vào hàng đợi blocked[p] và giữ ở đó cho tới khi nó an toàn để phân chia. Nếu không có thông báo trong blocked[p] thì earliest[p] là tập m.timestamp, bởi vì chúng ta bây giờ biết rằng không có thông báo sớm hơn được phân chia từ p.
Một thông báo không bị chặn chỉ nếu không có thông báo với nhãn thời gian sớm hơn có thể được phân chia từ các bộ xử lý khác. Có nghĩa là, thông báo m tại đầu của blocked[p] không bị chặn chỉ nếu không có earliest[i] mà nhỏ hơn m.timestamp=earliest[k]. Từ khi m có thể được phân chia, chúng ta cần cập nhật
earliest[k]. Nếu blocked[k] là không trống, thông báo sớm nhất có thể được phân chia từ k là thông báo tiếp theo trong blocked[k]. Cách khác, thông báo sớm nhất có thể tới từ bộ xử lý k phải có nhãn thời gian tại ít nhất lk lớn hơn m.timestamp = earliest[k].