我想测试使用WaitForMultipleObjects,为此我想要使用一个循环启动多个线程,每个线程都传递不同的ThreadArgs。
(基本上只是一个包含五个ThreadArgs和五个HANDLEs的数组?)
当我尝试创建结构或HANDLE的数组时,两者都不起作用,我得到错误'无法为两者分配一个常量大小为0的数组',并且''初始化':无法从'转换'为后者处理'处理'[]''。
对于结构,数组是否适合执行此操作? (另外,一个注释 - 它必须保留一个结构,因为它最终将包含六个成员,我只是试图让它以更简单的形式工作,因为添加这些成员应该非常简单)
我假设一系列Handles是最好的方法,但我该如何宣布?
谢谢!
#include <windows.h>
#include <iostream>
#include <process.h>
struct ThreadArgs
{
int id;
};
ThreadArgs args = {1};
unsigned int __stdcall MyThread(void *data)
{
std::cout << "Hello World!\n";
ThreadArgs *args = (ThreadArgs *) data;
std::cout << (*args).id;
return 2;
}
int main()
{
HANDLE hThread = (HANDLE) _beginthreadex(NULL, 0, MyThread, &args, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
while(true);
}
以上是我目前的代码。
我试图使用 -
创建一个HANDLE数组HANDLE hThread[5];
修改
错误在这一行,当它被改为HANDLE数组[5] -
HANDLE hThread[0] = (HANDLE) _beginthreadex(NULL, 0, MyThread, &args, 0, NULL);
答案 0 :(得分:1)
您需要使用WaitForMultipleObjects并传递一个句柄数组以等待多个线程完成。请在此处查看example。
#include <windows.h>
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;
CRITICAL_SECTION cs;
struct ThreadArgs
{
int id;
};
VOID MyThread(void *data)
{
EnterCriticalSection(&cs);
ThreadArgs *args = (ThreadArgs*)data;
cout << args->id << endl;
LeaveCriticalSection(&cs);
}
int main()
{
InitializeCriticalSection(&cs);
vector <HANDLE> T;
DWORD id;
ThreadArgs args[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++)
{
T.push_back(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MyThread, &args[i], 0, &id));
}
WaitForMultipleObjects(5, &T[0], TRUE, INFINITE);
DeleteCriticalSection(&cs);
}