2

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

来自维基百科

在伪代码中,发送算法是:

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

接收消息的算法是:

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

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

4

1 回答 1

3

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

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

由于time()系统调用不使用单调时钟,如果“Unix时间戳”是指“返回的值time(NULL)”,那么答案是“使用Unix时间戳肯定是错误的”。

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

于 2018-10-30T16:19:16.240 回答