据我所知,lamport时间戳是一种用于确保跨多个站点的事件具有部分排序的工具。
在伪代码中,发送算法为:
time = time + 1; time_stamp = time; send(message, time_stamp);
接收消息的算法是:
(message, time_stamp) = receive(); time = max(time_stamp, time) + 1;
时间戳是否可能是unix时间戳,它会根据时间而不是事件自动增加?如果每个站点都使用unix时间戳,这是否意味着事件仍在本地进行部分排序?我是否需要更改/省略接收消息的算法,或者完全使用unix时间戳只是错误的做法?
答案 0 :(得分:3)
不幸的是,除非您使用MONOTONIC_CLOCK(虽然不能保证它存在于给定的系统中,但实际上已广泛实现),否则不能保证Unix时间戳会单调增加。
即使支持单调时钟,也不能保证两次连续调用clock_gettime会返回不同的值,如果两次调用之间没有足够的时间。
由于time()
系统调用未使用单调时钟,因此如果使用“ Unix timestamp”,您的意思是“ time(NULL)
返回的值”,那么答案是“使用Unix时间戳。”
如果使用单调时钟,则还需要全局跟踪返回的值,以确保每个调用都会产生不同的值。但是在这种情况下,您最好只使用一个计数器。还值得注意的是,单调时钟不是从纪元算起的(通常是从系统启动算起的,尽管标准将其完全打开),因此您不能从比较两个不同系统的单调时钟值中得出任何推论。