如果我在具有原子读取和递增/递减支持的硬件上,我可以volatile sig_atomic_t
在 C++03 中使用 a 来访问原子操作并避免完全成熟的互斥锁,还是必须等待 C++11 和std::atomic<int>
?
问问题
1085 次
1 回答
5
一些编译器提供了非标准语义,volatile
允许它工作,但它不是可移植的。 volatile
用于访问硬件,而不是用于线程间通信。无法保证volatile
一个线程对变量的写入将永远对另一个线程可见-对于线程之间的通信,您需要同步操作,例如内存屏障,这些操作由对std::atomic
类型的操作提供。
有关更多信息,请参阅“volatile vs. volatile”和 Hans Boehm 的 ISO C++ 论文“Should volatile Acquire Atomicity and Thread Visibility Semantics?” (两个链接都取自最近的Herb Sutter 博客文章的脚注)
您不必等待编译器中的 C++11 支持,大多数平台都提供了一些特定于平台的原子操作,其中还包括任何必要的内存屏障,例如 GCC 的__sync
内置、Solaris 的原子操作或 Win32 的互锁函数. 还有一些可移植的库,例如提议的Boost.Atomic,它们为特定于平台的实现提供了一个通用接口。
于 2012-10-11T00:16:58.313 回答