我可以使用 Unix 时间作为 Lamport 时间戳吗?

Can I use Unix time for a Lamport timestamp?

据我所知,lamport 时间戳是一种用于确保跨多个站点的事件具有部分顺序的工具。

From wikipedia:

In pseudocode, the algorithm for sending is:

time = time + 1;
time_stamp = time;
send(message, time_stamp);

The algorithm for receiving a message is:

(message, time_stamp) = receive();
time = max(time_stamp, time) + 1;

时间戳是否可以是 unix 时间戳,它根据时间而不是事件自动递增?如果每个站点都使用 unix 时间戳,那是否意味着事件仍然在本地部分排序?我必须 alter/omit 接收消息的算法,还是完全使用 unix 时间戳是错误的?

不幸的是,Unix 时间戳不能保证单调递增,除非你使用 MONOTONIC_CLOCK(不能保证在给定系统上存在,但实际上被广泛实现)。

即使支持单调时钟,也不能保证对 clock_gettime 的两次连续调用会 return 不同的值,如果两次调用之间没有经过足够的时间。

由于time()系统调用不使用单调时钟,如果"Unix timestamp"是指"the value returned by time(NULL)",那么答案是"it's definitely wrong to use the Unix timestamp."

如果您使用的是单调时钟,那么您还需要全局跟踪 returned 值,以确保每次调用都产生不同的值。但在那种情况下,您还不如使用计数器。还值得注意的是,单调时钟不从纪元开始计算(通常它们从系统启动开始计算,尽管标准将其完全打开),因此您无法通过比较两个不同系统的单调时钟值来推断任何内容。