インターネットでは、並列プログラミングでのキーワードの使用について多くの議論がありvolatile
、時には矛盾した議論があります。
このトピックに関するより信頼できる議論の1つは、ArchRobisonによるこの記事のようです。彼が使用している例は、あるスレッドから別のスレッドに値を渡すタスクです。
スレッド1は行列積を計算し、それをスレッド2に渡します。スレッド2はそれを使って他のことを行います。マトリックスは可変M
であり、フラグはvolatile
ポインターR
です。
- スレッド1は、行列積Mを乗算して計算し、RをMを指すようにアトミックに設定します。
- スレッド2は、R!= NULLになるまで待機してから、Mを係数として使用して別の行列積を計算します。
つまり、Mはメッセージであり、Rは準備完了フラグです。
著者は、Rを揮発性として宣言することで、スレッド1からスレッド2への変更を伝播する際の問題を解決できるが、これが発生したときにMの値がどうなるかについては保証しないと主張しています。そして、への割り当てR
とM
並べ替えることができます。したがって、両方M
をR
揮発性にするか、pthreadなどのライブラリで同期メカニズムを使用する必要があります。
私の質問は、Cで次のことを行う方法です
1)2つのスレッド間で単一のフラグを共有する方法-フラグをアトミックに割り当てる方法。他のスレッドが変更を確認し、他のスレッドの変更をテストすることを確認します。この場合、揮発性物質の使用は合法ですか?または、一部のライブラリは、おそらくメモリバリアを含む、概念的に優れた、またはより高速な方法を提供できますか?
2)Robisonの例を正しく実行する方法、つまり、マトリックスMをあるスレッドから別のスレッドに送信して安全に実行する方法(できればpthreadを使用して移植可能)