gpt4 book ai didi

c++ - 等待 CreateThread 创建的未知数量的线程

转载 作者:行者123 更新时间:2023-11-28 00:36:17 25 4
gpt4 key购买 nike

我需要创建未知数量的线程,最后想等待所有创建的线程完成它们的工作。搜索之后,我只能使用 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 内核数的数组,并在任何给定时间以该线程数的最大值执行。但是为此我需要开发一个排队机制等。有没有办法通过上面示例中所示的方式等待所有创建的线程?

最佳答案

使用 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 个线程,这将不起作用。

关于c++ - 等待 CreateThread 创建的未知数量的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com