WaitForMultipleObjects For Stack - PullRequest
       0

WaitForMultipleObjects For Stack

1 голос
/ 12 ноября 2011

Вы знаете, что WaitForMultipleObjects функция из библиотеки Windows в c получает параметр в виде массива для объектов.Но в моей домашней работе помощник хочет сохранить все потоки в стеке, а не в массиве. Как я могу использовать эту функцию со стеком?

Ответы [ 4 ]

6 голосов
/ 12 ноября 2011

Вы можете вызывать эту функцию только с массивом. Это не то, что вы можете контролировать. Таким образом, вам нужно использовать стек, который способен представлять его содержимое в виде массива. Или массив, способный работать как стек.

Однако вполне вероятно, что использование стекового контейнера для ваших потоков просто неуместно. Почему ваш домашний помощник хочет использовать стек?

1 голос
/ 12 ноября 2011

Если существует фиксированный порядок, в котором завершаются потоки, и вы хотите ждать, пока они завершатся один за другим, стек имеет смысл.

Предположим, у вас есть 3 потока и их дескрипторы хранятся в массиве:

HANDLE handles[3];

Теперь, если вы сделаете WaitForMultipleObjects(3, handles, FALSE /* bWaitAll */, INFINITE), он вернется после завершения первого потока. Если вы снова вызовете WaitForMultipleObjects () с теми же параметрами, он не будет ждать завершения следующего потока. Это не удастся. Чтобы дождаться оставшихся потоков, вам придется исключить дескриптор завершенного потока из массива.

Если потоки завершаются в фиксированном порядке 2, 1, 0, вы можете подождать так:

WaitForMultipleObjects(3, handles, FALSE /* bWaitAll */, INFINITE);
WaitForMultipleObjects(2, handles, FALSE /* bWaitAll */, INFINITE);
WaitForMultipleObjects(1, handles, FALSE /* bWaitAll */, INFINITE);

как если бы вы вызывали WaitForMultipleObjects () в стеке, выталкивая из него дескриптор после каждого вызова WaitForMultipleObjects ().

1 голос
/ 12 ноября 2011

Вы имеете в виду последовательность объектов ввода для WaitForMultipleObjects важна?

Нет никакой разницы между отсортированной последовательностью объектов ввода и случайной последовательностью их для этой функции.

Кроме того, во многих реализациях стек является массивом, и вы можете передать указатель этого массива в эту функцию.

0 голосов
/ 12 ноября 2011

Я, вероятно, не понимаю вопроса, потому что мой ответ - это то, что я обычно делаю в любом случае:

HANDLE threads[2]; // On stack, as opposed to new HANDLE[2]
unsigned threadID;

threads[0] = (HANDLE)_beginthreadex(NULL, 0, &OneThreadFunc, NULL, 0, &threadID);
threads[1] = (HANDLE)_beginthreadex(NULL, 0, &AnotherThreadFunc, NULL, 0, &threadID);

WaitForMultipleObjects(threads, _countof(threads), TRUE, INFINITE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...