为什么关闭了多个线程同时等待的信号量后,有的WaitForXXX无法结束?解决办法

为什么关闭了多个线程同时等待的信号量后,有的WaitForXXX无法结束?
本帖最后由 virtualxmars 于 2013-10-19 15:38:27 编辑
演示代码如下:


#include <windows.h>
using namespace std;

HANDLE s1, s2;

DWORD __stdcall t(LPVOID) {
HANDLE events[] = {s1, s2};
while (true) {
if (WAIT_FAILED==::WaitForMultipleObjects(_countof(events), events, TRUE, INFINITE))
break;
}

printf("end 1\n");
return 0;
}

DWORD __stdcall t2(LPVOID) {
HANDLE events[] = {s1, s2};
while (true) {
if (WAIT_FAILED==::WaitForSingleObject(s1, INFINITE))
break;
}

printf("end 2\n");
return 0;
}

DWORD __stdcall t3(LPVOID) {
HANDLE events[] = {s1, s2};
while (true) {
if (WAIT_FAILED==::WaitForSingleObject(s2, INFINITE))
break;
}

printf("end 3\n");
return 0;
}

int main(int argc, char* argv[]) {
s1 = CreateSemaphore(NULL, 0, 1, NULL);
s2 = CreateSemaphore(NULL, 1, 4, NULL);
HANDLE thread = ::CreateThread(NULL, 0, t, NULL, 0, NULL);
HANDLE thread2 = ::CreateThread(NULL, 0, t, NULL, 0, NULL);
HANDLE thread3 = ::CreateThread(NULL, 0, t2, NULL, 0, NULL);
HANDLE thread4 = ::CreateThread(NULL, 0, t3, NULL, 0, NULL);
CloseHandle(s1);
CloseHandle(s2);
printf("2:%d\n", WaitForSingleObject(thread2, INFINITE));
printf("3:%d\n", WaitForSingleObject(thread3, INFINITE));
printf("4:%d\n", WaitForSingleObject(thread4, INFINITE));
printf("1:%d\n", WaitForSingleObject(thread, INFINITE));

return 0;
}


在主函数中已经明确关闭s1,s2,但程序行为不稳定,少数情况可以结束程序,但大多数次数中,程序锁在等待线程结束上,望指教
线程 信号量 死锁 Windows

------解决方案--------------------
你等待一个已经关闭了的handle,本身就是有问题的,如果你想同时锁定2个,为啥不用event? 一般的流程都是先wait在close
------解决方案--------------------
Semaphore 需要 ReleaseSemaphore