2016-06-30 4 views
0

各スレッドが異なる仮想メモリ領域で動作している場合、OpenMPまたはPosixスレッドを単独で実行することからmlock()を安全に呼び出すことができますか?システム全体の同期障壁を作成するか、すべてのスレッドを何らかの方法でストールさせますか?mlock()とThreading

重複している場合はお詫び申し上げます。私はGoogleが "mlock openmp"/"mlock thread safety"の検索ですぐに答えを出さなかったのに驚いた。最も近いのはNon-blocking mlock()の2番目の答えで、mlock()は別のスレッドから呼び出すことができ、同期障壁を強制したり必要としないことを示しているようです。

+0

スレッドセーフではない関数のリストに 'mlock()'は表示されません:http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.htmlおそらく安全であるはずです。 – EOF

+0

ありがとう!これは、mlockもスレッド間の暗黙の同期を引き起こさないことを意味しますか? –

+0

いいえ、 'mlock()'は非同期セーフな関数のリストにありませんhttp://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.htmlので、必要に応じてロックを取ることができます。このようなロックはリーフレベルのロックとなるため、デッドロックに参加できないため、スレッドセーフではありません。 – EOF

答えて

1

mlock()複数のスレッドから一度に呼び出しても安全です。

はそれがmlock()に他の呼び出しに対して同期させるかどうかについては、それが品質の-実装の問題だ - 原則として任意のシステムコールは、他に対して同期させることができで、それを禁止POSIXには内容がありません。実際には、プロセスのメモリマップ上で動作するシステムコールはお互いに競合する傾向があることがよくあります(mlock()は、mlock()コールだけでなく、mmap()と競合するかもしれません)。実際に競合が問題になっているかどうかをテストする必要があります。

関連する問題