是clock_gettime()调用原子?

时间:2014-01-29 09:46:23

标签: c linux clock

我在多线程代码中使用timespec结构 - 一个线程调用clock_gettime()来填充全局timespec结构,另一个 - 读取这个结构。问题:clock_gettime()是调用原子还是我必须使用互斥?

2 个答案:

答案 0 :(得分:0)

如果是的话我会很惊讶,虽然我找不到任何参考。调用clock_gettime只不过是调用库函数。所以如果我是对的,你肯定需要一个互斥锁,以确保另一个线程在struct timespec读取它时不会读取clock_gettime

答案 1 :(得分:0)

clock_gettime手册页 - http://linux.die.net/man/3/clock_gettime - 并没有说它是原子的,所以你没有合理的期望它是原子的,结构包含两个long s所以你'即使是希望,也没有特别健全的基础。尽管如此,如果您的硬件支持64位值的原子操作,而不是像Remus建议的那样使用指针,或者使用互斥锁,那么可以填充另一个timespec然后原子地将其复制到您的全局,但如果您的硬件不能保证内核更新在内核和CPU上可见(例如最近的Intel / AMD硬件,但至少10年前,当我关心UltraSparc没有)时,你需要一个明确的内存屏障(即一些机器代码注入您的程序 - 可能使用编译器或系统提供程序“内置”功能)以确保可见性;互斥实现已经为您处理。