C++ 等待所有线程完成

C++ Wait all threads to finish

本文关键字:线程 等待 C++      更新时间:2023-10-16
#include <stdio.h>
#include <process.h>
#include <wtypes.h>
typedef unsigned int (__stdcall * THREAD_FUN_TYPE)(void *);
int ThreadIp(void* param)
{
    while(true)
    {
        printf("I'm runing!n");
    }
    return 0;
}

int main()
{
    int iThreadNum=100;
    HANDLE* phThreads = new HANDLE[iThreadNum];
    for (int i=0;i<iThreadNum;++i)
    {
        phThreads[i]=(HANDLE*)_beginthreadex(NULL, 0,  (THREAD_FUN_TYPE)ThreadIp,NULL, NULL, NULL);
    }
    int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE);
    printf("End!n");
    return 0;
}

我希望程序将在 WaitForMultipleObjects 处停止,直到所有线程都结束(直到成功创建所有线程(。但是程序不会在 WaitForMultipleObject 处停止,而所有线程仍在运行。所以我尝试使用SetEvent,但仍然是相同的问题:

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 = new HANDLE[iThreadNum];
 for (int i=0;i<iThreadNum;++i)
 {
     m_iCurThreadNum=i;
     phThreads[i] = _beginthreadex(...);
  }
 int nIndex = ::WaitForMultipleObjects(iThreadNum,phThreads,1,INFINITE);

如果你的线程较少,它能工作吗?手册说,如果你有超过MAXIMUM_WAIT_OBJECTS,你需要做额外的工作,特别是

nCount [in] 数组中指向的对象句柄数 lpHandles。对象句柄的最大数量为 MAXIMUM_WAIT_OBJECTS。此参数不能为零。

有关讨论,请参阅此处。

可能值得检查一下等待函数返回了什么。

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

struct ThreadStruct{
    bool Done;
    char* ParamData;
    int ParamDataSize;
};
int ThreadIp(void* param)
{
    ThreadStruct* ts = (ThreadStruct*)param;
    while(true)
    {
        printf("I'm runing!n");
    }
    ts->Done = true;
    return 0;
}
int main()
{
    int iThreadNum=100;
    HANDLE* phThreads = new HANDLE[iThreadNum];
    ThreadStruct* structs = new ThreadStruct[iThreadNum];
    for (int i=0;i<iThreadNum;++i)
    {
        ZeroMemory(structs[i], sizeof(ThreadStruct));
        phThreads[i]=(HANDLE*)_beginthreadex(NULL, 0,  (THREAD_FUN_TYPE)ThreadIp, structs[i], NULL, NULL);
        ResetEvent(phThreads[i]);
    }
    for(unsigned int i=0; i<iThreadNum;){
        if(!structs[i]->Done) i=0;
        else i++;
    }
    printf("End!n");
    return 0;
}