TIPS:クリティカルセクション
今日、他人が作ったプログラムでクリティカルセクションを使っているのを見て、ふと疑問に思った。
そのプログラムでは、関数の実行開始時にEnterCriticalSection関数(排他設定)を実行、関数終了時にLeaveCriticalSection関数(排他解除)を実行している。
その間に呼び出す関数でも同じように排他の設定、解除を行う。
つまり、排他設定を複数回 実行し、排他解除を同じ回数 実行する。
クリティカルセクションってのは、1つのプロセス内の複数のスレッドで1つのリソースを使うときに排他を行うための仕組み。同じスレッドでは複数回、EnterCriticalSection関数(排他の設定)を実行できる。
んで、疑問に思ったのは、LeaveCriticalSection関数は、1回実行したら排他が解除されるのだろうか?それとも、EnterCriticalSection関数を実行した回数とおなじ回数 LeaveCriticalSection関数を実行しなくてはならないのだろうか?
ITPro「第3回 マルチタスクに不可欠な同期の仕組みを学ぶ」のプログラムを参考に実際に試したところ、EnterCriticalSection関数を実行した回数分、EnterCriticalSection関数を実行しないと排他は解除されず、ほかのスレッドは動作が停止した。もちろん同じ回数実行したら、ほかのスレッドは動作した。
めでたしめでたし。
« 暖房の設定温度 (今日のテーマ) | トップページ | もういくつ寝ると冬休み (今日のテーマ) »
コメント