2012-01-30 49 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)。