WaitForMultipleObjects For Stack

时间:2011-11-12 11:15:42

标签: c windows stack

你知道c中来自windows库的WaitForMultipleObjects函数是将参数作为对象的数组获取。但是在我的作业中,助手希望将所有线程保留在堆栈中而不是数组中,如何在堆栈中使用此函数?

4 个答案:

答案 0 :(得分:6)

您只能使用数组调用此函数。这不是你可以控制的东西。因此,您需要使用能够将其内容作为数组公开的堆栈。或者一个能够像堆栈一样运行的数组。

然而,完全合理的是,为您的线程使用堆栈容器是不合适的。为什么你的家庭作业助理要使用堆栈?

答案 1 :(得分:1)

您的意思是WaitForMultipleObjects的输入对象序列很重要吗?

对于此函数,条目对象的排序顺序与它们的随机顺序之间没有区别。

此外,在许多实现中,堆栈是一个数组,您可以将该数组的指针传递给此函数。

答案 2 :(得分:1)

如果有一个固定的顺序,其中线程完成,并且你想等待它们一个接一个地完成,那么堆栈是有意义的。

假设您有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()之后弹出一个句柄。

答案 3 :(得分:0)

我可能不明白这个问题,因为我的回答是我通常做的事情:

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);