【发布时间】:2017-05-10 16:30:54
【问题描述】:
我对@987654321@ 以及如何(安全地)使用它们感到困惑。在我的应用程序中,我有一个创建 gui 线程的类,但是当 gui 由 gui 线程构造时,主线程需要等待。
情况与下面的函数相同。主线程创建一个互斥体、锁和condition_variable。然后它制作线程。虽然这个 worker thread 还没有通过某个点(这里打印数字),但不允许主线程继续(即必须 wait 打印所有数字)。
在这种情况下如何正确使用condition_variables?另外,我读到自发唤醒是一个问题。我该如何处理它们?
int main()
{
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
std::condition_variable convar;
auto worker = std::thread([&]{
/* Do some work. Main-thread can not continue. */
for(int i=0; i<100; ++i) std::cout<<i<<" ";
convar.notify_all(); // let main thread continue
std::cout<<"\nworker done"<<std::endl;
});
// The main thread can do some work but then must wait until the worker has done it's calculations.
/* do some stuff */
convar.wait(lck);
std::cout<<"\nmain can continue"<<std::endl; // allowed before worker is entirely finished
worker.join();
}
【问题讨论】:
-
为什么“正确”?您是否期望人们默认会解释如何错误地使用某些东西?! “安全”是什么意思?
标签: c++ multithreading concurrency condition-variable