読者です 読者をやめる 読者になる 読者になる

OpenSemaphore

OpenSemaphoreは、セマフォを開くWindowsAPI・・・。

OpenSemaphore 関数

クリティカルセクションミューテックスは1つしか同時に実行できなかったが、
セマフォは指定した数までは同時に実行でき、それを超えるとどれかのスレッドが終わらない限り待つという形になる・・・。

セマフォも、ミューテックス同様、名前をキーにして開くことができる・・・。

セマフォカウンタはスレッド中でOpenSemaphoreされるたびに減るようになっていて、0になると非シグナル状態(つまりロックされたのと同じ状態)になる・・・。
ここでは第2引数初期値2、第3引数最大値2とすることで、2つは同時実行できるようなセマフォにしている・・・。

こちらもWaitForSingleObjectでセマフォハンドルがシグナル状態がどうかをチェックして、そうでない場合シグナル状態まで待つという形になっている・・・。

i = 1, m_iNo = 0, m_tszMessage = No.0
i = 1, m_iNo = 1, m_tszMessage = No.1
i = 2, m_iNo = 0, m_tszMessage = No.0
i = 2, m_iNo = 1, m_tszMessage = No.1
i = 3, m_iNo = 0, m_tszMessage = No.0
i = 3, m_iNo = 1, m_tszMessage = No.1
i = 4, m_iNo = 0, m_tszMessage = No.0
i = 4, m_iNo = 1, m_tszMessage = No.1
i = 5, m_iNo = 0, m_tszMessage = No.0
i = 5, m_iNo = 1, m_tszMessage = No.1
i = 1, m_iNo = 2, m_tszMessage = No.2
i = 1, m_iNo = 3, m_tszMessage = No.3
i = 2, m_iNo = 2, m_tszMessage = No.2
i = 2, m_iNo = 3, m_tszMessage = No.3
i = 3, m_iNo = 2, m_tszMessage = No.2
i = 3, m_iNo = 3, m_tszMessage = No.3
i = 4, m_iNo = 2, m_tszMessage = No.2
i = 4, m_iNo = 3, m_tszMessage = No.3
i = 5, m_iNo = 2, m_tszMessage = No.2
i = 5, m_iNo = 3, m_tszMessage = No.3
i = 1, m_iNo = 4, m_tszMessage = No.4
i = 2, m_iNo = 4, m_tszMessage = No.4
i = 3, m_iNo = 4, m_tszMessage = No.4
i = 4, m_iNo = 4, m_tszMessage = No.4
i = 5, m_iNo = 4, m_tszMessage = No.4
dwExitCode[0] = 0
dwExitCode[1] = 1
dwExitCode[2] = 2
dwExitCode[3] = 3
dwExitCode[4] = 4
続行するには何かキーを押してください . . .

開始してしばらく、1秒ごとに2個ずつ実行されているのがわかる・・・。
セマフォカウンタの初期値が2だからである・・・。

Sample/OpenSemaphore.cpp at master · bg1bgst333/Sample · GitHub