私はマルチスレッドを研究しており、セマフォと相互排除の概念を理解しようとしています。私がオンラインで見つけた例のほとんどは、セマフォまたはミューテックスを実装するためにある種のライブラリ (例: pthread
) を使用していますが、クリティカル セクションを確立する単純なセマフォの実装にもっと興味があります。メモリの領域。
このタスクには、ミューテックス (用語を正しく理解していればバイナリ セマフォとも呼ばれます) が必要になると思います。セマフォがコードのセクションを単一のスレッドに「ロック」することで競合状態を防ぐ方法はわかりますが、セマフォ自体で競合状態が発生するのを防ぐものは何ですか?
ロックを追跡するためにint値を保持するバイナリセマフォを想像します。
Semaphore
---------
int lock = 1;
unsigned P(void){
if(lock > 0){
lock--;
return 0; /* success */
}
return 1; /* fail */
}
void V(void){
lock++;
}
2 つのスレッドが同時に関数を呼び出し、両方が同時にチェックにP
到達し、条件をtrueとして評価するとします。これにより、両方のスレッドが同時にメモリの同じ領域へのアクセスを許可される競合状態が作成されます。if(lock > 0)
では、セマフォの実際の実装でこの競合状態が発生するのを妨げているのは何でしょうか?