Appearance
如果我需要等待超过MAXIMUM_WAIT_OBJECTS
个线程怎么办?
原文:What if I need to wait for more than
MAXIMUM_WAIT_OBJECTS
threads?
日期:2024年8月23日
客户有一个创建大量线程的测试,他们希望测试等待所有线程退出,然后再继续下一步。但是,线程数超过了最大句柄数,超过了MAXIMUM_WAIT_OBJECTS
。如果无法通过单个WaitForMultipleObjects
等待所有线程,那么最佳方法是什么?
客户指出,该文档提供了一些建议。一种是将对象划分为最多MAXIMUM_WAIT_OBJECTS
大小的组,并为每个组创建一个线程来调用WaitForMultipleObjects
。另一个建议是在每个句柄上调用RegisterWaitForSingleObject
。
客户认为这些方法过于复杂。如果只将对象划分为大小MAXIMUM_WAIT_OBJECTS
组,然后进入对每个组调用WaitForMultipleObjects
的循环,怎么样?“我们是否遗漏了一些细节?”
进程句柄和线程句柄具有“等待它们是幂等的”属性。等待进程或线程句柄会等待进程或线程退出,但它对进程或线程本身没有影响。这与一些其他类型的句柄不同:等待信号量、互斥量和自动重置事件具有副作用:使用信号量令牌、获取互斥量的所有权以及重置自动重置事件。
此外,进程和线程句柄还具有以下属性:一旦它们变为有信号,它们就永远不会变为无信号。这意味着,一旦你成功等待它们发出信号,你就不必担心将来可能再也收不到信号。
因此,如果你正在等待一组进程和线程句柄全部发出信号,则可以自由地按任何顺序等待它们,并且不需要WaitForMultipleObjects
的特殊行为,在该行为中,它不会产生任何等待副作用,直到所有对象同时发出信号。
所以,没错,你可以按MAXIMUM_WAIT_OBJECTS
的分块等待他们。但实际上,即使这样也是一项艰巨的工作。你其实可以一次等待一个。
c++
for (auto&& handle : m_threadHandles)
{
REQUIRE(WaitForSingleObject(handle, INFINITE)
== WAIT_OBJECT_0);
}