ここでは、クリティカル セクション オブジェクトを使用するのが最も簡単な方法です。これは軽量の同期オブジェクトです。
例としていくつかのコードを次に示します。
#define NUMBER_OF_THREADS 100
// global
CRITICAL_SECTION csMyCriticalSectionObject;
int i = 0;
HANDLE hThread[NUMBER_OF_THREADS];
int main(int argc, char *argv[])
{
// initialize the critical section object
InitializeCriticalSection(&csMyCriticalSectionObject);
// create 100 threads:
for (int n = 0; n < NUMBER_OF_THREADS; n++)
{
if (!CreateThread(NULL,0,func,hThread[n],0,NULL))
{
fprintf(stderr,"Failed to create thread\n");
}
}
// wait for all 100 threads:
WaitForMultipleObjects(NUMBER_OF_THREADS,hThread,TRUE,INFINITE);
// this can be made more detailed/complex to find each thread ending with its
// exit code. See documentation for that
}
リンク: CreateThread 関数とWaitForMultipleObjects 関数
スレッドで:
// i is global, no need for i to returned by the thread
DWORD WINAPI func( LPVOID lpvParam )
{
EnterCriticalSection(&csMyCriticalSectionObject);
i++;
LeaveCriticalSection(&csMyCriticalSectionObject);
return GetLastError();
}
ミューテックスおよび/またはセマフォは、この目的のために遠くまで行きます。
編集: セマフォは基本的に複数回解放できるミューテックスです。解放操作の数を格納するため、同じ数の待機を解放できます。