如何等待几个std :: threads

时间:2016-03-03 15:59:45

标签: c++ multithreading c++11 stdthread

基于这个问题:Timeout for thread.join() ManuelAtWork'答案)我试图为我的std :: threads实现超时:

std::vector<std::shared_ptr<TestFlow>> testFlowObjects;
std::thread workerThreads[MAX_PARALLEL_NR]; // maximum of 32 threads
std::vector<std::future<void>> helperThreads;

for(int readerCounter=0; readerCounter<GetNumberOfReader(); readerCounter++)
{
    testFlowObjects.push_back(std::make_shared<TestFlow>(m_logFiles));

    testFlowObjects.back()->SetThreadID(readerCounter);
    testFlowObjects.back()->SetTestResults(m_testResultsVector); // vector of int
    workerThreads[readerCounter] = std::thread(&TestFlow::DoWork, testFlowObjects.back());
}

// wait for all threads
for(int threadCount=0; threadCount<GetNumberOfReader(); threadCount++)
{
    // use helper threads to be able to join with timeout
    helperThreads.push_back(std::async(std::launch::async, &std::thread::join, &workerThreads[threadCount]));
    helperThreads.back().wait_for(std::chrono::seconds(5)); // 5 sec
}

如果我使用连接而不是std :: future帮助程序线程代码,它可以正常工作,但我不能等待无限!

使用std :: future方法似乎并非所有线程都已完成,我得到了:R6010: abort() has been called

任何想法如何正确地做到这一点?

我想我必须改变它:

if(helperThreads.back().wait_for(std::chrono::seconds(5)) == std::future_status::timeout) // WHAT SHOULD I DO HERE???

1 个答案:

答案 0 :(得分:0)

总之,建议

您发布的方法(ManuelAtWork的答案)是一种解决方法,使用var results= client.Cypher .Match("(n1)-[r]-[n2]") .Where("n1.NodeId={startNodeId} and n2.NodeId={endNodeId}") .WithParam("startNodeId",startNodeId) .withParam("endNodeId",endNodeId) .Return((n1, r1 n2) => new {Edge=r.As<Node<string>>(),Type=r.Type()}, Class1= n1.As<Class1>(), Class2= n2.As<Class2>()}) .Results; 的等待通信语义作为等待std::future超时的方法。这也可以通过条件变量进行通信,作为所提到的接受答案。 但是,为什么还要在单独的std::thread::join中启动ThreadFunc?只需使用std::thread,它将返回将执行std::async的未来,即。 ThreadFunc

你可能得到了中止,因为你在哪里尝试加入,不可加入的线程,或者因为你没有加入一些显式的(当移动一个新的,在旧的TestFlow::DoWork的析构函数中)位置

std::thread

背景/问题

如果你仍想使用workerThreads[readerCounter] = std::thread(&TestFlow::DoWork, testFlowObjects.back()); ,你必须自己进行通信并在线程之间等待。这意味着许多类型的任务和问题(停止,加入,等待,线程池)。 您链接的变通方法假设您有一些其他方法来终止线程。 (通过沟通)