(简而言之: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