我可以使用volatile sig_atomic_t来避免C ++ 03中的互斥锁吗?

时间:2012-10-11 00:00:56

标签: c++ mutex volatile stdatomic sig-atomic-t

如果我在具有原子读取和递增/递减支持的硬件上,我可以在C ++ 03中使用volatile sig_atomic_t来访问原子操作并避免使用完整的互斥锁,或者我必须等待C ++ 11和std::atomic<int>

1 个答案:

答案 0 :(得分:5)

某些编译器为volatile提供了非标准语义,这样可以使其工作,但它不可移植。 volatile用于访问硬件,用于线程间通信。无法保证一个线程对volatile变量的写入将对另一个线程可见 - 对于线程之间的通信,您需要同步操作,例如内存屏障,这些操作由{{1}上的操作提供} types。

有关详细信息,请参阅"volatile vs. volatile"和Hans Boehm的ISO C ++论文"Should volatile Acquire Atomicity and Thread Visibility Semantics?"(从最近的Herb Sutter blog post脚注中获取的两个链接)

您不必在编译器中等待C ++ 11支持,但大多数平台都提供一些特定于平台的原子操作,这些操作还包括任何必要的内存屏障,例如: GCC的__sync内置,Solaris'原子操作,或Win32的Interlocked功能。还有一些可移植的库,例如建议的Boost.Atomic,它们为特定于平台的实现提供了一个通用接口。