2012-01-30 54 views
3

我想端口一些一段代码从Java到C++ 11和我有点混淆挥发性关键字。Java和C++ 11挥发性

我不熟悉Java语言和我没有得到一个volatile变量是什么。它保证每个线程都可以访问变量的最新值 - 这是C++的易失性行为。但它通常用于同步 - 是否对volatile变量atomic进行所有操作?

所以我觉得thath的C++ 11很好的替代Java的波动将标准::原子。或者我完全错了,因为我错过了一些额外的Java易失性功能?

回答

6

是的,他们会是一个很好的匹配,有在Dr Dobbs这个好文章。

简而言之,有序原子变量是安全的阅读和没有做任何明确的锁定 上同时 多个线程写,因为它们提供了两个保证:他们的读取和写入 保证在被执行它们出现在程序的 源代码中的顺序;并且每次读取或写入都保证是原子的,全部或全部不变。

Java提供这种类型的变量为volatile,C++为std::atomic

+0

锁定线程同步 线程'volatile methods http://www.youtube.com/watch?v=KzDShvKbEMs#t=49m38s – alexsmail 2012-09-08 21:34:53

1

这个页面有Java的volatile关键字一个相当不错的解释:http://www.javamex.com/tutorials/synchronization_volatile.shtml。在我看来,基本类型(例如整数)上的C++ 11 std::atomic<>确实是一个很好的替代品。请注意,std::atomic<>为读取 - 修改 - 写入操作提供支持(例如,compare_exchange_strongfetch_add)。