我在多线程代码中使用timespec结构 - 一个线程调用clock_gettime()
来填充全局timespec结构,另一个 - 读取这个结构。问题:clock_gettime()
是调用原子还是我必须使用互斥?
答案 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没有)时,你需要一个明确的内存屏障(即一些机器代码注入您的程序 - 可能使用编译器或系统提供程序“内置”功能)以确保可见性;互斥实现已经为您处理。