我需要创建一个未知数量的线程,最后想要等待所有创建的线程完成他们的工作。搜索之后,我只能使用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内核数量的数组,并且在任何给定时间执行最大数量的线程。但为此,我需要开发一个排队机制等。有没有办法等待所有创建的线程,如上例所示?
答案 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并退出线程。
没有数组,没有向量,没有,(理智),线程数限制。