2012-01-17 10 views
2

私はGlibのmutexユーティリティを使って並行処理を行っています。 mutexのロックを解除した後、変更された変数の更新されたバージョンが他のスレッドから見えることは保証されていますか? これらのスレッドは、安全に読むためにmutexのロックを取得する必要がありますか?ミューテックスは可視性(GLib)を保証していますか?

​​
+2

はい、それはミューテックスの全体のポイントです。これがなければ、ミューテックスは役に立たないでしょう。ミューテックスは常に完全なメモリバリアです。 –

+0

私の理解では、相互排除(mutex)と可視性は別々のものです。だから、それは意味をなさないでしょう。たぶん答えとしてあなたのコメントを投稿してください。 –

+0

唯一の(または少なくとも主な)理由は、データアクセスを同期させることです。それがしなかった場合、私は多くの実用的な使用を考えることができません... –

答えて

1

ミューテックスを実装した賢い人たちは、この本を読んで、可視性と障壁を心配してください。この本は、ミューテックスが読書のときと書くときの両方で開催されるべきだと述べている。

CPUは読み込みを並べ替えることができ、これは多くのことを行います。キャッシュミスのペナルティを軽減するのに役立ちます。なぜなら、実際に必要となる前にデータをフェッチし始めるからです。
したがって、別のCPUが書き込んでロックを解除した後に変数を読み取ると、実際にこれらの処理が行われる前に読み取りが実行される可能性があります。
ミューテックスはメモリ障壁として機能し、この問題(およびその他の問題)を防止します。

0

mutexオブジェクトのみg_static_mutex_*関数を通じて読まれるべきです。それは、他のC識別子と同じ規則に従い、識別子のリンケージに

g_static_mutex_trylock 

:あなたがミューテックスを取得できるかどうかを知りたい場合は、この機能を使用することができ、それがどのスコープに依存しますいくつかのストレージクラス指定子(例えば、staticまたはextern)が指定されている場合

+0

私の質問はメモリの可視性に関連しています、私はあなたがそれを誤解していると思います –

0

私は答えを見つけたと思います。 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-それもキャッシュされていません) しかし、ミューテックスを使用する必要があるかどうかは不明です。

関連する問題