pthread_create()
POSIX 環境では、A と B の2 つのスレッド (で初期化) があります。
A はフラグ変数 (an int
) に書き込みを行う場合があり、B はそれを読み取る場合があります。
この変数をミューテックスで保護する必要がありますか?それとも、これらの操作は常にアトミックと見なすことができますか?
pthread_create()
POSIX 環境では、A と B の2 つのスレッド (で初期化) があります。
A はフラグ変数 (an int
) に書き込みを行う場合があり、B はそれを読み取る場合があります。
この変数をミューテックスで保護する必要がありますか?それとも、これらの操作は常にアトミックと見なすことができますか?
変数が true/false フラグよりも複雑な場合は、保護する必要があります。1 つのスレッドが書き込み操作の途中で変数を読み取らないという保証はありません。
特定の状況でのミューテックス保護の不使用を軽減する方法はありますが (変数が常に増加するだけの場合は、読み取りとチェックを繰り返し行うなど)、変数への一般的な変更については、ミューテックスの方が適しています。パフォーマンスについてあまり気にする必要はありません。ミューテックスは非常に効率的です。
もちろん、できるだけ多くの時間を短縮する必要がある場合は、使用できるトリックがありますが、移植性はほとんどありません。
はい、両方のスレッドでフラグを使用している場合はミューテックスが必要です。スレッド B がフラグに基づいて 2 つの操作を実行し、スレッド A がフラグ値を更新し続けると仮定するため、Mutex は必須です。スレッド B では、最初の操作が完了した後にコンテキスト スイッチが発生し、スレッド A がフラグ値を変更すると、スレッド B は 2 番目の操作の新しいフラグ値を取得するため、mutext は必須です。
スレッドのローカル メモリにグローバル フラグの値を保持し、ローカル操作が完了したらグローバル フラグを更新することで、ロックを最小限に抑えることができます。アプローチは要件によって異なります。