ブロックの状態をチェックするために読み取り専用で共有メモリにアクセスしている場合if()
でも、ミューテックスをロックする必要がありますか? 例えば
mutex_lock();
if (var /* shared memory */) {
}
mutex_unlock();
ここでロックする必要がありますか?
ブロックの状態をチェックするために読み取り専用で共有メモリにアクセスしている場合if()
でも、ミューテックスをロックする必要がありますか? 例えば
mutex_lock();
if (var /* shared memory */) {
}
mutex_unlock();
ここでロックする必要がありますか?
読んでいる変数が同時に書き込まれる可能性がある場合は、はい、ミューテックスのロックを取得する必要があります。
コンパイラがそのために必要なプリミティブを提供する場合にのみ、アトミックに読み取ることができます。これは、C11 および C++11 に付属するアトミック機能か、コンパイラによって提供されるその他の言語拡張機能のいずれかです。次に、ミューテックスの取得を条件付きに移動できますが、テストが終わるまでミューテックスを取得するのを待つと、テストしてからミューテックスを取得するまでの間に誰かがそれを変更する可能性があります。
if (example) {
// "example" variable could be changed here by another thread.
mutex_lock();
// Now the condition might be false!
mutex_unlock();
}
したがって、プロファイリングでミューテックスの取得がボトルネックとして特定されない限り、条件分岐の前にミューテックスを取得することをお勧めします。(そして、テストされた変数が CPU レジスタよりも大きい場合 (たとえば、32 ビット CPU では 64 ビットの数値)、他の種類の変数がなければミューテックスの取得を遅らせるオプションさえありません。アトミックフェッチまたは比較プリミティブの。)