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