(要するに:main()のWaitForSingleObjectは以下のプログラムでハングします)。
スレッドをディスパッチし、スレッドが終了するのを待ってから再開するコードを書き込もうとしています。コストのかかる毎回スレッドを作成する代わりに、スレッドをスリープ状態にしました。メインスレッドは、CREATE_SUSPENDED状態でXスレッドを作成します。
同期は、MaximumCountとしてXを使用するセマフォを使用して行われます。セマフォのカウンタがゼロになり、スレッドがディスパッチされます。スレッドはいくつかのばかげたループを実行し、スリープ状態になる前にReleaseSemaphoreを呼び出します。次に、メインスレッドはWaitForSingleObjectをX回使用して、すべてのスレッドがジョブを終了し、スリープしていることを確認します。次に、ループしてすべてをやり直します。
時々、プログラムは終了しません。プログラムをくちばしにすると、WaitForSingleObjectがハングしていることがわかります。これは、スレッドのReleaseSemaphoreが機能しなかったことを意味します。何も印刷されていないので、おそらく何も問題はありませんでした。
たぶん、2つのスレッドがReleaseSemaphoreを同時に呼び出すべきではありませんが、それはセマフォの目的を無効にするでしょう...
私はそれを食べません...
スレッドを同期する他のソリューションはありがたいことに受け入れられています!
#define TRY 100
#define LOOP 100
HANDLE *ids;
HANDLE semaphore;
DWORD WINAPI Count(__in LPVOID lpParameter)
{
float x = 1.0f;
while(1)
{
for (int i=1 ; i<LOOP ; i++)
x = sqrt((float)i*x);
while (ReleaseSemaphore(semaphore,1,NULL) == FALSE)
printf(" ReleaseSemaphore error : %d ", GetLastError());
SuspendThread(ids[(int) lpParameter]);
}
return (DWORD)(int)x;
}
int main()
{
SYSTEM_INFO sysinfo;
GetSystemInfo( &sysinfo );
int numCPU = sysinfo.dwNumberOfProcessors;
semaphore = CreateSemaphore(NULL, numCPU, numCPU, NULL);
ids = new HANDLE[numCPU];
for (int j=0 ; j<numCPU ; j++)
ids[j] = CreateThread(NULL, 0, Count, (LPVOID)j, CREATE_SUSPENDED, NULL);
for (int j=0 ; j<TRY ; j++)
{
for (int i=0 ; i<numCPU ; i++)
{
if (WaitForSingleObject(semaphore,1) == WAIT_TIMEOUT)
printf("Timed out !!!\n");
ResumeThread(ids[i]);
}
for (int i=0 ; i<numCPU ; i++)
WaitForSingleObject(semaphore,INFINITE);
ReleaseSemaphore(semaphore,numCPU,NULL);
}
CloseHandle(semaphore);
printf("Done\n");
getc(stdin);
}