2012-01-30 11 views
3

JavaのコードをC++ 11に移植したいのですが、私はvolatileキーワードと混同しています。javaとC++ 11 volatile

私はJava言語に精通しておらず、揮発性変数が何であるか分かりません。すべてのスレッドが変数の最新の値にアクセスできることが保証されています。これはC++の揮発性の動作です。しかし、通常は同期するために使用されます - すべてのアクションは揮発性の可変原子に対して実行されますか?

だから、私は、Javaのvolatileの代わりにC++ 11の良い置き換えがstd :: atomicになると思います。または私は間違っている、私はいくつかの追加のJavaの揮発性の機能を逃した原因ですか?

答えて

6

はい、良い一致があります。Dr Dobbsにはこれに関する良い記事があります。一言で言えば

、彼らは2つの保証を提供するため、アトミック変数を読み、 をロック明示的に行わず、同時に 複数のスレッドに書き込みをしても安全です命じ:自分の読み取りと書き込みがで実行する を保証されていますあなたのプログラムに表示される順番は ソースコードです。それぞれの読み取りまたは書き込みはアトミックであることが保証されています( 全部または無し)。

Javaは、volatilestd::atomicとしてこのタイプの変数を提供します。

+0

ロックフリースレッド同期 スレッドの揮発性メソッド http://www.youtube.com/watch?v=KzDShvKbems#t=49m38s – alexsmail

1

このページは、Javaのvolatileキーワード:http://www.javamex.com/tutorials/synchronization_volatile.shtmlに関するかなり良い説明です。実際には、プリミティブ型(例えば整数)のC++ 11 std::atomic<>が良い代替品であると私は思っています。 std::atomic<>は、リード・モディファイ・ライト操作(例えば、compare_exchange_strongおよびfetch_add)をサポートすることに注意してください。