Использование массивов для выполнения цикла запуска нескольких потоков, передачи различных параметров и возврата дескрипторов для WaitForMultipleObjects

#c #windows #multithreading

#c #Windows #многопоточность

Вопрос:

Я хочу протестировать использование WaitForMultipleObjects, и для этого я хочу запустить несколько потоков, используя цикл, каждый из которых передает разные ThreadArgs.

(По сути, просто массив из пяти ThreadArgs и пяти дескрипторов?)

Когда я пытаюсь создать массив либо из структуры, либо из ДЕСКРИПТОРА, ни то, ни другое не будет работать, и я получаю ошибку «не удается выделить массив постоянного размера 0» для обоих, и «инициализация»: не удается преобразовать из ‘HANDLE’ в ‘HANDLE []» для последнего.

Является ли массив подходящим способом сделать это в отношении структуры? (Также, примечание — это должно остаться структурой, поскольку в конечном итоге она будет содержать шесть элементов, я просто пытаюсь сначала заставить ее работать в более простой форме, поскольку добавление этих элементов должно быть очень простым)

И я бы предположил, что массив дескрипторов — лучший способ сделать это, но как мне его объявить?

Спасибо!

 #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, amp;args, 0, NULL); 

    WaitForSingleObject(hThread, INFINITE);


    while(true);

}
  

Приведенный выше мой код на данный момент.

Я пытался создать массив дескрипторов с помощью —

 HANDLE hThread[5]; 
  

Редактировать:

Ошибка возникает в этой строке, когда она изменяется на массив ДЕСКРИПТОРОВ[5] —

 HANDLE hThread[0] = (HANDLE) _beginthreadex(NULL, 0, MyThread, amp;args, 0, NULL); 
  

Комментарии:

1. Где ошибка в вашем коде?

2. Ах, извините — в текущем коде нет ошибки — он работает; однако, когда я пытаюсь создать массив с ДЕСКРИПТОРОМ hThread[5]; (что будет означать, что ДЕСКРИПТОР hThread = становится ДЕСКРИПТОРОМ hThread[0], а WaitForSingleObect (hThread, БЕСКОНЕЧНЫЙ) становится WaitForSingleObject(hThread[0], БЕСКОНЕЧНЫЙ)…

3. … ошибка в этой строке — HANDLE hThread[0] = (HANDLE) _beginthreadex(NULL, 0, MyThread, amp;args, 0, NULL);

Ответ №1:

Вам нужно использовать WaitForMultipleObjects и передать ему массив дескрипторов для ожидания завершения нескольких потоков. Смотрите пример здесь.

 #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(amp;cs);
    ThreadArgs *args = (ThreadArgs*)data;
    cout << args->id << endl;
    LeaveCriticalSection(amp;cs);
}

int main()
{
    InitializeCriticalSection(amp;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, amp;args[i], 0, amp;id));
    }

    WaitForMultipleObjects(5, amp;T[0], TRUE, INFINITE);

    DeleteCriticalSection(amp;cs);
}
  

Комментарии:

1. Хорошо, спасибо — я попытаюсь разобраться с дескрипторами из этого примера. Как насчет создания структуры? Я получаю ‘не удается выделить массив постоянного размера 0’, когда я пытаюсь создать массив структуры.

2. Можете ли вы опубликовать свой код о том, как вы создаете массив struct?

3. Извините, я не совсем понял пример? Я не вижу, где запускаются два потока? И почему существует два типа дескрипторов? Извините.

4. Что касается теста struct — Test[2]; Это создаст его без ошибок, но как только я пытаюсь получить доступ к его элементам, я получаю строку ошибок.

5. @ShimmerGeek: Как я предполагаю, вам нужно инициализировать свои массивы внутри функции, не находящейся в глобальной области видимости, или сделать это Test test[2] = {1, 2}; .