并非所有线程都通知了condition_variable.notify_all()
Not all threads notified of condition_variable.notify_all()
我有以下场景:
condition_variable cv;
mutex mut;
// Thread 1:
void run() {
while (true) {
mut.lock();
// create_some_data();
mut.unlock();
cv.notify_all();
}
}
// Thread 2
void thread2() {
mutex lockMutex;
unique_lock<mutex> lock(lockMutex);
while (running) {
cv.wait(lock);
mut.lock();
// copy data
mut.unlock();
// process data
}
}
// Thread 3, 4... - same as Thread 2
我一直运行线程1以获取新数据。其他线程使用condition_variable等待新数据可用,然后复制它并对其进行一些处理。线程执行的工作在完成所需的时间上是不同的,其思想是线程只有在完成旧数据时才会获得新数据。在此期间获得的数据允许被"遗漏"。我不使用共享互斥锁(仅用于访问数据),因为我不希望线程相互依赖。
上面的代码在Windows上工作得很好,但是现在我在Ubuntu上运行它,我注意到当notify_all()被调用时,只有一个线程被通知,而其他线程只是挂在wait()上。为什么呢?Linux是否需要使用不同的方法来使用condition_variable?
您的代码立即显示UB,因为它重新锁定了cv在退出等待时重新锁定的唯一锁。
还有其他问题,比如没有检测到虚假的唤醒。
最后cv通知所有被通知的当前等待线程。
运气好。
互斥锁和条件变量是同一结构的两个部分。你不能混用互斥锁和cvs。
试试这个:
void thread2() {
unique_lock<mutex> lock(mut); // use the global mutex
while (running) {
cv.wait(lock);
// mutex is already locked here
// test condition. wakeups can be spurious
// copy data
lock.unlock();
// process data
lock.lock();
}
}
根据本文档:
这段代码任何想要等待std::condition_variable的线程都必须
- 在同一个互斥锁上获取std::unique_lock,
- 执行wait, wait_for或wait_until。等待操作自动释放互斥锁,并挂起对象的执行线程。
- 当条件变量被通知,超时过期或发生虚假唤醒时,线程被唤醒,互斥锁被唤醒自动再获得的。然后线程应该检查条件如果唤醒是假的,继续等待。
void thread2() {
mutex lockMutex;
unique_lock<mutex> lock(lockMutex);
while (running) {
不能。
相关文章:
- 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++ 扩展名 " " 不是类型名称"
- C++ "Using Uninitialized Memory.. (variable name) "
- cudaMallocManaged for host-initiated variable
- Cppcheck "Reference to auto variable returned"失败的原因?
- condition_variable.notify是同步点吗
- 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