由于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");

最佳答案



如果您希望它与等待句柄一起使用,那就是您必须要做的。但是,如果您需要的东西会阻塞直到所有线程完成,则可以使用SemaphoreSynchronization Barrier

关于c++ - 如何克服WaitForMultipleObjects的MAXIMUM_WAIT_OBJECTS限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18969234/

10-09 08:22