基于这个问题: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???
答案 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());
,你必须自己进行通信并在线程之间等待。这意味着许多类型的任务和问题(停止,加入,等待,线程池)。
您链接的变通方法假设您有一些其他方法来终止线程。 (通过沟通)