ミューテックスを処理する場合、必要なメモリバリアはpthreadAPI自体によって処理されると聞いています。この件についてもっと詳しく知りたいのですが。
- これらの主張は、少なくとも周りの最も一般的なアーキテクチャでは真実ですか?
- コンパイラはこの暗黙の障壁を認識し、コードを生成するときに操作の並べ替え/ローカルレジスタからの読み取りを回避しますか?
- メモリバリアはいつ適用されますか:ミューテックスを正常に取得した後、およびそれを解放した後?
ミューテックスを処理する場合、必要なメモリバリアはpthreadAPI自体によって処理されると聞いています。この件についてもっと詳しく知りたいのですが。
POSIX仕様には、「他のスレッドに関してメモリを同期する」pthread_mutex_lock()
必要のある関数がリストされています。これには、やのような関数が含まれますpthread_mutex_unlock()
。
付録A.4.11では、「メモリを同期する」機能について詳しく説明しています。
...メモリ操作とこれらの関数の呼び出しが最適化によって並べ替えられないように、高度なコンパイルシステムによって認識される必要があります。と
...特定のマシンによっては、メモリ同期命令を追加する必要がある可能性があります。
暗黙のメモリ同期命令の種類が明示的に指定されることはありません。暗黙の指定では、「同期命令」のペアを使用して、一方のスレッドでの読み取りがもう一方のスレッドでの書き込みの後に行われる必要があることを確認します。正しく動作します。これには、コンパイラとアーキテクチャの並べ替え効果の両方が含まれます。