1

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

4

1 回答 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 回答