等待CreateThread创建的未知线程数

时间:2013-12-28 19:33:18

标签: c++ windows multithreading visual-c++ visual-studio-2008

我需要创建一个未知数量的线程,最后想要等待所有创建的线程完成他们的工作。搜索之后,我只能使用WaitForMultipleObjects(. . .)等待一些已知数量的已创建线程,这些线程需要指向创建线程句柄数组的指针。以下代码是该方案的示例。

#include "stdafx.h"
#include <Windows.h>
#include <time.h>

FILE* fp;
time_t start;

struct mydata{
    int a, b;
};

void myFn(mydata* p)
{
    fprintf(fp, "a = %d\n", p->a);
    fprintf(fp, "b = %d\n", p->b);
    delete p;
}

bool condition()
{
     if(time(0) - start >= 1)
        return false;
     return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
    start = time(0);
    fopen_s(&fp, "outOfExe.txt", "w");
    mydata* dataToGive;
    int n = 0;
    while(condition())
    {
        n++;
        dataToGive = new mydata;
        dataToGive->a = 2*n;
        dataToGive->b = 4*n;
        HANDLE WINAPI handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myFn, dataToGive, 0, NULL);
    }
}

我能想到的解决方案是创建一个大小等于CPU内核数量的数组,并且在任何给定时间执行最大数量的线程。但为此,我需要开发一个排队机制等。有没有办法等待所有创建的线程,如上例所示?

2 个答案:

答案 0 :(得分:2)

使用std::vector绝对是一种方法,不需要队列或者可以存储预设数量的线程句柄。下面的代码将创建所有线程,然后等待所有线程完成。

std::vector<HANDLE> threadHandles;
while(condition())
{
    n++;
    dataToGive = new mydata;
    dataToGive->a = 2*n;
    dataToGive->b = 4*n;
    HANDLE handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myFn, dataToGive, 0, NULL);
    if(handle != INVALID_HANDLE_VALUE)
    {
        threadHandles.push_back(handle);
    }
}

::WaitForMultipleObjects(threadHandles.size(), &threadHandles[0], TRUE, INFINITE);

正如Martin WaitForMultipleObjects所指出的那样,它可以等待64个句柄的数量。如果你需要超过64个线程,这将无效。

答案 1 :(得分:1)

int threadCount,一个关键部分,一个事件和WaitForSingleObject?

锁定CS,创建线程,接受threadCount,然后解锁CS并等待事件。

在线程函数/方法中,然后执行您的操作,最后锁定CS,减去threadCount。如果它为0,则表示事件发生。解锁CS并退出线程。

没有数组,没有向量,没有,(理智),线程数限制。