私はGlibのmutexユーティリティを使って並行処理を行っています。 mutexのロックを解除した後、変更された変数の更新されたバージョンが他のスレッドから見えることは保証されていますか? これらのスレッドは、安全に読むためにmutexのロックを取得する必要がありますか?ミューテックスは可視性(GLib)を保証していますか?
答えて
ミューテックスを実装した賢い人たちは、この本を読んで、可視性と障壁を心配してください。この本は、ミューテックスが読書のときと書くときの両方で開催されるべきだと述べている。
CPUは読み込みを並べ替えることができ、これは多くのことを行います。キャッシュミスのペナルティを軽減するのに役立ちます。なぜなら、実際に必要となる前にデータをフェッチし始めるからです。
したがって、別のCPUが書き込んでロックを解除した後に変数を読み取ると、実際にこれらの処理が行われる前に読み取りが実行される可能性があります。
ミューテックスはメモリ障壁として機能し、この問題(およびその他の問題)を防止します。
mutex
オブジェクトのみg_static_mutex_*
関数を通じて読まれるべきです。それは、他のC識別子と同じ規則に従い、識別子のリンケージに
g_static_mutex_trylock
:あなたがミューテックスを取得できるかどうかを知りたい場合は、この機能を使用することができ、それがどのスコープに依存しますいくつかのストレージクラス指定子(例えば、static
またはextern
)が指定されている場合
私の質問はメモリの可視性に関連しています、私はあなたがそれを誤解していると思います –
私は答えを見つけたと思います。 Gthreadはpthreadのラッパー(http://redmine.lighttpd.net/boards/3/topics/425による)であり、pthreadsはメモリバリアを実装しているようです(http://stackoverflow.com/questions/3208060/does-guarding-a-variable-with-a-pthpthread-mutex-guarantee-それもキャッシュされていません) しかし、ミューテックスを使用する必要があるかどうかは不明です。
- 1. ThreadPoolExecutor.execute()でメモリの可視性を保証
- 2. 原子変数はメモリの可視性を保証しますか?
- 3. NSMutableArrayの可視性の表示/保持
- 4. GroupBoxの可視性を子供の可視性にバインドできますか?
- 5. ビットセットは連続性を保証されていますか?
- 6. コンポジットコントロール内のパネルは可視性を無視します
- 7. 可視性はAMOUT
- 8. プロパティに基づいて可視性バインディングを変更します。
- 9. Android:テキストの可読性を保証しながらビットマップをぼかします
- 10. 私はトグルの可視性に間違っています
- 11. jQueryのcss()が可視性を使用していません
- 12. glib/gioを使ってルートディレクトリを監視する方法は?
- 13. LibGDX可視性
- 14. SSRS可視性
- 15. 可視性
- 16. 決済ゲートウェイ可用性期待/保証
- 17. Androidビュー:可視性を設定する前に視認性をチェックしてパフォーマンスを改善できますか?
- 18. DataBoundアイテムの可視性をfalseに設定していますか?
- 19. selectedindexに基づいてコントロールの可視性を設定しますか?
- 20. divタグの可視属性が機能していません
- 21. 可視性細胞は
- 22. 更新の可視性は、
- 23. SSRS可視性IFNOTHINGまたは値> =
- 24. マクロで構造体フィールドの可視性を保持する
- 25. PostgreSQL - トランザクションはアトミック性を保証しますか?
- 26. msmqはトランザクションキューのデータの整合性を保証しますか?
- 27. RDBMSは行レベルの原子性を保証しますか?
- 28. スパークはデータの確実性を保証しますか?
- 29. スレッド、ワーカー、ミューテックス、スタック可能の違いは?
- 30. DataGridColumn可視性コンバータ
はい、それはミューテックスの全体のポイントです。これがなければ、ミューテックスは役に立たないでしょう。ミューテックスは常に完全なメモリバリアです。 –
私の理解では、相互排除(mutex)と可視性は別々のものです。だから、それは意味をなさないでしょう。たぶん答えとしてあなたのコメントを投稿してください。 –
唯一の(または少なくとも主な)理由は、データアクセスを同期させることです。それがしなかった場合、私は多くの実用的な使用を考えることができません... –