#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};
.