Если существует фиксированный порядок, в котором завершаются потоки, и вы хотите ждать, пока они завершатся один за другим, стек имеет смысл.
Предположим, у вас есть 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 ().