C中的volatile int和C ++ 0x的std :: atomic 一样好吗?

我需要在我的程序中有primefaces变量。 以前我使用的是std::atomic ,但我现在正在使用的平台没有支持C ++ 0x的g ++编译器。 我使用了volatile int ,它似乎正在工作,因为我还没有在多核系统中遇到竞争条件,我正在测试它。

我的问题是volatile intprimefaces的,比如std::atomic吗? 此外,它是否会产生内存障碍(我也需要)?

我看到你在一些评论中询问GCC,你走了。

GCC的内置函数用于primefaces存储器访问

volatile与multithreading无关。 它没有强制执行内存屏障(尽管有些编译器可能会选择添加它),并且它不保证关于非易失性对象的读/写重新排序。

添加了volatile来支持写入内存映射硬件I / O寄存器,以及这种情况,重要的是你的写入没有被优化掉,但没有精确的顺序保证wrt。 需要非易失性读/ wrties。

您可能还想阅读此内容

易失性变量并不意味着内存障碍,也没有std::atomicexchangecompare_exchange_*操作。 它们确实避免了编译器在机器代码级别上将负载提升到多个负载(反之亦然,并且类似于商店),但就是这样。

您可能对这些文章感兴趣:

  • 挥发性被认为有害
  • 易失性:multithreading编程几乎无用

如果你没有std::atomic ,你可能想要使用boost :: atomic ,或者使用你正在使用的任何编译器提供的低级屏障和primefaces操作原语。

在C ++ 0x之前,该语言不是线程感知的,因此它不会阻止多次访问。 宣布它不稳定将有所帮助,但它不会阻止比赛。

有关详细信息,请参见http://en.wikipedia.org/wiki/Volatile_variable 。

要真正使操作成为primefaces,您需要使用线程库(win32线程,pthreads等)提供的任何锁定机制。

Herb Sutter对这里的差异进行了很好的总结。 总结(剪切和粘贴):

为了安全地编写在不使用锁的情况下在线程之间进行通信的无锁代码,更喜欢使用有序的primefaces变量:Java / .NET volatile,C ++ 0x atomic和C兼容的atomic_T。

要安全地与具有exception语义的特殊硬件或其他内存通信,请使用不可优化的变量:ISO C / C ++ volatile。 但请记住,这些变量的读写不一定是primefaces的。

volatile基本上告诉编译器它不能对特定内存位置的内容做出假设。 例如

 bool test = true; while(!test) { /* do something (eg wait) */ } 

编译器可能会优化整个while因为它假定test始终为真。 但是,如果test在某个时刻将从其他地方(例如某些硬件或其他线程)更新,我们不希望编译器假设它知道test 。 我们可以告诉编译器使用volatile

正如其他答案所说,它不能保证什么顺序访问内存位置。

我无耻地从某个地方偷走了这个例子,但不记得我在哪里看到它。