如何正确使用 std::condition_variable
How to use a std::condition_variable correctly?
我对conditions_variables
以及如何(安全地(使用它们感到困惑。在我的应用程序中,我有一个制作 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();
}
通常,
您会有一些可观察的共享状态,阻止其更改:
bool done = false;
std::mutex done_mx;
std::condition_variable done_cv;
{
std::unique_lock<std::mutex> lock(done_mx);
std::thread worker([&]() {
// ...
std::lock_guard<std::mutex> lock(done_mx);
done = true;
done_cv.notify_one();
});
while (true) { done_cv.wait(lock); if (done) break; }
// ready, do other work
worker.join();
}
请注意,您将在循环中等待,直到满足实际条件。还要注意,对实际共享状态(done
(的访问是通过互斥done_mx
序列化的,每当访问done
时,互斥锁就会被锁定。
有一个帮助程序成员函数可以为您执行条件检查,因此您不需要循环:
done_cv.wait(lock, [&]() { return done; });
相关文章:
- C++ Singleton - Prevent ::instance() to variable
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- C++:寻找"returning address of local variable..."的更正
- C++ - 在我尝试制作一个简单的计算器时有一个"uninitialized local variable y used"警告
- Visual Studio Code "variable " u8 的 C/C++ 扩展名 " " 不是类型名称"
- 我需要std::condition,但有两个以上的选择
- C++ "Using Uninitialized Memory.. (variable name) "
- cudaMallocManaged for host-initiated variable
- Cppcheck "Reference to auto variable returned"失败的原因?
- OpenCV 和 C++:"Can't resolve variable 'Mat`"
- 是否有用于"go to variable type definition" C++中"auto"变量的 Visual Studio 键盘快捷方式?
- 冲刺错误"variable may be unsafe" (C4996)...选择?
- Visual Studio生成"Error: uninitialized local variable 'x' "而在线编译器不会 - 为什么?
- GUID variable for JPEG,BMP,PNG
- 如何修复初始化后'stack around variable was corrupted.'变量未更改为分配的值
- C++:从 "const variable*" 转换为"uint32"会失去精度
- C++17 'inline variable' vs 'extern' 关键字继承自 C 的新功能
- Tensorflow C++ API assign variable value