使用数组循环启动多个线程,传递不同的参数,并返回WaitForMultipleObjects的句柄

时间:2011-05-12 11:19:57

标签: c++ windows multithreading

我想测试使用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); 

1 个答案:

答案 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);
}