为什么关闭了多个线程同时等待的信号量后,有的WaitForXXX无法结束?解决办法
为什么关闭了多个线程同时等待的信号量后,有的WaitForXXX无法结束?
演示代码如下:
在主函数中已经明确关闭s1,s2,但程序行为不稳定,少数情况可以结束程序,但大多数次数中,程序锁在等待线程结束上,望指教
------解决方案--------------------
你等待一个已经关闭了的handle,本身就是有问题的,如果你想同时锁定2个,为啥不用event? 一般的流程都是先wait在close
------解决方案--------------------
Semaphore 需要 ReleaseSemaphore
演示代码如下:
#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