如果我在具有原子读取和递增/递减支持的硬件上,我可以在C ++ 03中使用volatile sig_atomic_t
来访问原子操作并避免使用完整的互斥锁,或者我必须等待C ++ 11和std::atomic<int>
?
答案 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,它们为特定于平台的实现提供了一个通用接口。