C++ C++;等待所有线程完成 #包括 #包括 #包括 typedef unsigned int(u stdcall*THREAD_FUN_TYPE)(void*); int ThreadIp(void*param) { while(true) { printf(“我正在跑步!\n”); } 返回0; } int main() { int-iThreadNum=100; HANDLE*phThreads=新句柄[iThreadNum]; 对于(int i=0;i

C++ C++;等待所有线程完成 #包括 #包括 #包括 typedef unsigned int(u stdcall*THREAD_FUN_TYPE)(void*); int ThreadIp(void*param) { while(true) { printf(“我正在跑步!\n”); } 返回0; } int main() { int-iThreadNum=100; HANDLE*phThreads=新句柄[iThreadNum]; 对于(int i=0;i,c++,multithreading,winapi,events,wait,C++,Multithreading,Winapi,Events,Wait,您应该等待线程句柄,而不是不相关的事件: 试着这样做: int iThreadNum=100; HANDLE* phThreads = new HANDLE[iThreadNum]; for (int i=0;i<iThreadNum;++i) { phThreads[i]=CreateEvent(NULL, FALSE, FALSE,NULL); ResetEvent(phThreads[i]); } int nIndex = ::WaitForMultipleObjec

您应该等待线程句柄,而不是不相关的事件:

试着这样做:

int iThreadNum=100;
HANDLE* phThreads = new HANDLE[iThreadNum];
for (int i=0;i<iThreadNum;++i)
{
    phThreads[i]=CreateEvent(NULL, FALSE, FALSE,NULL);
    ResetEvent(phThreads[i]);
}
int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE);
int-iThreadNum=100;
HANDLE*phThreads=新句柄[iThreadNum];

对于(int i=0;i您应该等待线程句柄,而不是不相关的事件:

试着这样做:

int iThreadNum=100;
HANDLE* phThreads = new HANDLE[iThreadNum];
for (int i=0;i<iThreadNum;++i)
{
    phThreads[i]=CreateEvent(NULL, FALSE, FALSE,NULL);
    ResetEvent(phThreads[i]);
}
int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE);
int-iThreadNum=100;
HANDLE*phThreads=新句柄[iThreadNum];

对于(int i=0;i如果线程数较少,它是否有效?如果线程数超过
最大等待对象数,则需要进行额外的工作

nCount[in]指向的数组中的对象句柄数 lpHandles。对象句柄的最大数目为 最大\u等待\u对象数。此参数不能为零

进行讨论


可能还需要检查等待函数返回的内容。

如果线程数较少,它是否有效?如果线程数超过
最大等待对象数,则需要额外工作

nCount[in]指向的数组中的对象句柄数 lpHandles。对象句柄的最大数目为 最大\u等待\u对象数。此参数不能为零

进行讨论


可能也值得检查wait函数返回的内容。

我会在调用_beginthreadex之前分配一个结构,并通过threads参数传递指向该结构的指针,并让该结构包含一个bool,该bool在完成时由线程设置

 int iThreadNum=100;
 HANDLE* phThreads = new HANDLE[iThreadNum];
 for (int i=0;i<iThreadNum;++i)
 {
     m_iCurThreadNum=i;
     phThreads[i] = _beginthreadex(...);
  }

 int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE);
struct-ThreadStruct{
布尔多;
字符*参数数据;
int参数化;
};
int ThreadIp(void*param)
{
ThreadStruct*ts=(ThreadStruct*)参数;
while(true)
{
printf(“我正在跑步!\n”);
}
ts->Done=true;
返回0;
}
int main()
{
int-iThreadNum=100;
HANDLE*phThreads=新句柄[iThreadNum];
ThreadStruct*structs=新的ThreadStruct[iThreadNum];

对于(int i=0;i我将在调用_beginthreadex之前分配一个结构,并通过threads参数传递指向该结构的指针,并使该结构包含一个bool,该bool在完成时由线程设置

 int iThreadNum=100;
 HANDLE* phThreads = new HANDLE[iThreadNum];
 for (int i=0;i<iThreadNum;++i)
 {
     m_iCurThreadNum=i;
     phThreads[i] = _beginthreadex(...);
  }

 int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE);
struct-ThreadStruct{
布尔多;
字符*参数数据;
int参数化;
};
int ThreadIp(void*param)
{
ThreadStruct*ts=(ThreadStruct*)参数;
while(true)
{
printf(“我正在跑步!\n”);
}
ts->Done=true;
返回0;
}
int main()
{
int-iThreadNum=100;
HANDLE*phThreads=新句柄[iThreadNum];
ThreadStruct*structs=新的ThreadStruct[iThreadNum];

对于(int i=0;i哪种故障?程序是否在~WaitForMultipleObjects~上停止?请在相应的线程函数中添加打印,并查看线程是否在很短的时间内运行。我已编辑了该问题。我希望所有线程的工作都完成,然后我可以做更多的事情。哪种故障?程序是否在~WaitForMultipleObj~上停止ects~?请在各自的线程函数中添加打印,看看线程是否在很短的时间内运行。我已编辑了问题。我希望所有线程的工作都完成,然后我可以做更多的事情。100个线程是很多线程。您的机器有多少个内核?它有8个内核。很抱歉,我刚刚看到您的回复。它不会一次运行所有线程n:-)100个线程就是很多线程。你的机器有多少个内核?它有8个内核。很抱歉,我刚刚看到你的回复。它不会一次运行所有线程。那么:-)