上网搜了下 关于 WaitForMultipleObjects等待多个线程退出的状态失败的情况,也有人遇到类似的情况。
一次项目中我也遇到这么个情况。项目中创建线程都是用的 _beginthread。WaitForSingleObject去等待 到没事,
但是,用 WaitForMultipleObjects去等待 _beginthread所创建的线程时,就遇到了问题,返回不成功。
后来把 创建线程的函数改为CreateThread,再调用WaitForMultipleObjects去等待 就能成功了。
原因未知,如果知道的大神们,望留言,学习学习。
测试代码如下:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdio.h>
#include <windows.h>
#include <process.h>
void th_1(void* pararm)
{
printf("TH_1\n");
}
DWORD WINAPI th_cr1(LPVOID lpThreadParameter)
{
printf("TH_1\n");
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hArr[10] = { 0 };
int nCount = sizeof(hArr) / sizeof(HANDLE);
for (int i = 0; i < nCount; i++)
{
hArr[i] = (HANDLE)_beginthread(th_1, 0, NULL);
}
Sleep(1000);
DWORD dw = WaitForMultipleObjects(nCount, hArr, TRUE, INFINITE);
//HANDLE hArr[10] = { 0 };
//int nCount = sizeof(hArr) / sizeof(HANDLE);
//for (int i = 0; i < nCount; i++)
//{
// hArr[i] = CreateThread(NULL, 0, th_cr1,NULL,1,NULL);
//}
//DWORD dw = WaitForMultipleObjects(nCount, hArr, TRUE, INFINITE);
//HANDLE* hArr = new HANDLE[10];
//hArr[0] = (HANDLE)9;
//for (int i = 1; i < 10; i++)
//{
// hArr[i] = CreateThread(NULL, 0, th_cr1, NULL, 1, NULL);
//}
//HANDLE* ph = hArr;
//DWORD dw = WaitForMultipleObjects((int)hArr[0], ph+1, TRUE, INFINITE);
//HANDLE hArr[11] = { 0 };
//int nCount = sizeof(hArr) / sizeof(HANDLE);
//hArr[0] = (HANDLE)10;
//for (int i = 1; i < nCount; i++)
//{
// hArr[i] = (HANDLE)_beginthread(th_1, 0, NULL);
//}
//HANDLE* ptemp = hArr + 1;
//DWORD dw = WaitForMultipleObjects(10, ptemp, TRUE, INFINITE);
//Sleep(1000);
return 0;
}