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

OpenMutex

OpenMutexは、ミューテックスを開くWindowsAPI・・・。

OpenMutex 関数

pthreadのミューテックは、スレッド間でミューテックスオブジェクトを共有し、それらをロックして使うような形だった・・・。
Win32スレッドのミューテックスは、名前をキーにしてミューテックスオブジェクトを開くような形になっている・・・。

ミューテックス名を適当に定義しておく・・・。
ここでは"Mutex"としておく・・・。

ミューテックスオブジェクトなどはTHREAD_PARAM構造体のメンバに無い・・・。

ミューテックスハンドルhMutexを用意して、CreateMutexでミューテックス名が"Mutex"なミューテックスを作成・・・。

スレッドを開始して、スレッドが終わるまで待ち、終わったら終了コードを出力するのだが、hMutexを使っている部分は無く、最後にCloseHandleで閉じている・・・。

ThreadProcの中で、OpenMutexを使って、再度ミューテックス名が"Mutex"なミューテックスを開いている・・・。
ミューテックスハンドルをWaitForSingleObjectでチェックして、シグナル状態でなければ開かれているということなので、開いたスレッドが終わるまで待つ・・・。
(スレッド自身がロックされていることを感知して待つわけではない・・・。)
終わったら、ReleaseMutexで解放し、さらにCloseHandleで閉じている・・・。

i = 1, m_iNo = 2, m_tszMessage = No.2
i = 2, m_iNo = 2, m_tszMessage = No.2
i = 3, m_iNo = 2, m_tszMessage = No.2
i = 4, m_iNo = 2, m_tszMessage = No.2
i = 5, m_iNo = 2, m_tszMessage = No.2
i = 1, m_iNo = 3, m_tszMessage = No.3
i = 2, m_iNo = 3, m_tszMessage = No.3
i = 3, m_iNo = 3, m_tszMessage = No.3
i = 4, m_iNo = 3, m_tszMessage = No.3
i = 5, m_iNo = 3, m_tszMessage = No.3
i = 1, m_iNo = 0, m_tszMessage = No.0
i = 2, m_iNo = 0, m_tszMessage = No.0
i = 3, m_iNo = 0, m_tszMessage = No.0
i = 4, m_iNo = 0, m_tszMessage = No.0
i = 5, m_iNo = 0, m_tszMessage = No.0
i = 1, m_iNo = 1, m_tszMessage = No.1
i = 2, m_iNo = 1, m_tszMessage = No.1
i = 3, m_iNo = 1, m_tszMessage = No.1
i = 4, m_iNo = 1, m_tszMessage = No.1
i = 5, m_iNo = 1, m_tszMessage = No.1
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
続行するには何かキーを押してください . . .

ミューテックス排他制御ができている・・・。

作ったミューテックスを名前をキーにして何度でも開けるので、共有するためにTHREAD_PARAM構造体をいじる必要は無い・・・。
ミューテックスはプロセスにも使えるので、二重起動防止処理などでよく使われている・・・。

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