(簡而言之:main()的WaitForSingleObject掛起在下面的程序中)。ReleaseSemaphore不釋放信號量
我正在嘗試寫一段代碼調度線程並等待它們在恢復之前完成。我不是每次都創建線程,而是花費很大,所以我讓他們睡着了。主線程以CREATE_SUSPENDED狀態創建X個線程。
同步使用X作爲MaximumCount的信號量完成。信號量的計數器被置零,線程被調度。在他們進入睡眠狀態之前,Thred會執行一些愚蠢的循環並調用ReleaseSemaphore。然後,主線程使用WaitForSingleObject X來確保每個線程完成其工作並正在休眠。然後它循環並再次完成。
程序不時退出。當我扼殺程序,我可以看到WaitForSingleObject掛起。這意味着線程的ReleaseSemaphore不起作用。沒有什麼是printf'ed所以沒有出錯。
也許兩個線程不應調用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);
}
不錯的理論/解釋。在恢復線程之前將主要進入睡眠狀態(1)似乎解決了這個問題,但隨後性能消失了。至少這證實了這個理論:主要的恢復線程還沒有睡覺\ o / – Gabriel 2010-03-03 22:57:04