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

EnterCriticalSection

EnterCriticalSectionは、排他制御する領域の開始位置であることを示すWindowsAPI・・・。

EnterCriticalSection 関数

クリティカルセクションは、phtreadにおけるミューテックスと同じような使い方・・・。
CRITICAL_SECTION型変数をスレッド間で共有し、あるスレッドがEnterCriticalSectionを呼んだら、他のスレッドはその先の排他制御領域に入れず、終わるまで待たされる・・・。
LeaveCriticalSectionが呼ばれたら、待っていたスレッドが排他制御領域に入ることができる・・・。

CRITICAL_SECTIONのポインタm_pCSをTHREAD_PARAMに持ち、

CRITICAL_SECTIONの実体csをInitializeCriticalSectionで初期化したら、それぞれのスレッドのm_pCSにアドレスを渡す・・・。
スレッドが終わった後にDeleteCriticalSectionをすること・・・。

ThreadProcの中で、引数から取り出したm_pCSをEnterCriticalSectionに渡す・・・。
その後、for文の中で出力とSleepを繰り返して、LeaveCriticalSectionでクリティカルセクションから抜ける・・・。

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 = 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 = 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
続行するには何かキーを押してください . . .

0番スレッドから1つずつしか実行されていない・・・。
つまり排他制御されているということ・・・。

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