由于MAXIMUM_WAIT_OBJECTS
函数的WaitForMultipleObjects
限制,我尝试编写自己的“等待线程”函数,但没有成功。你能给我一个提示,怎么做?
这是我的“等待线程”功能:
void WaitForThreads(std::set<HANDLE>& handles)
{
for (int i = 0; i < SECONDSTOWAIT; i++)
{
// erase idiom
for (std::set<HANDLE>::iterator it = handles.begin();
it != handles.end();)
{
if (WaitForSingleObject(*it, 0) == WAIT_OBJECT_0)
handles.erase(it++);
else
++it;
}
if (!handles.size())
// all threads terminated
return;
Sleep(1000);
}
// handles.size() threads still running
handles.clear();
}
只要线程运行,
WaitForSingleObject
就会返回WAIT_TIMEOUT
,但是当线程终止时,返回值是WAIT_FAILED
而不是WAIT_OBJECT_0
。我猜线程句柄不再有效,因为GetLastError
返回ERROR_INVALID_HANDLE
。MSDN建议以下解决方案:
但是在我看来,两者都太费力了。
编辑:
线程是使用MFC函数
AfxBeginThread
创建的。返回的CWinThread
指针仅用于获取关联的句柄。CWinThread* thread = AfxBeginThread(LANAbfrage, par);
if ((*thread).m_hThread)
{
threads.insert((*thread).m_hThread);
helper::setStatus("%u LAN Threads active", threads.size());
}
else
theVar->TraceN("Error: Can not create thread");
最佳答案
如果您希望它与等待句柄一起使用,那就是您必须要做的。但是,如果您需要的东西会阻塞直到所有线程完成,则可以使用Semaphore或Synchronization Barrier。
关于c++ - 如何克服WaitForMultipleObjects的MAXIMUM_WAIT_OBJECTS限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18969234/