C++多线程编程条件变量虚假唤醒(spurious wakeup)
来源:互联网 发布:软件大数据咨询顾问 编辑:程序博客网 时间:2024/05/17 18:13
最近在使用C++多线程的进行生产者消费者编程过程中遇到多线程同步的问题,比较奇怪的是条件变量等待过程中在条件未满足的线程竟然被唤醒了。
原始代码:
std::unique_lock<std::mutex> lk(mutex)if(queue.empty()){ cond_var_.wait(lk) queue.front(); ...}这种代码书写方式会存在以下情况:
有三个线程在等待一个队列,有以下情况发生:
(1)线程1在取到queue元素之后去做处理,之后queue为空
(2)线程2判断queue是否为空,此时queue为空,此时线程2阻塞在wait上
(3)线程3开始向queue里添加一个元素,然后调用notify
(4)此时阻塞在wait上的线程2被唤醒获取queue lock之前,如果这个时候线程1恰好处理完毕然后获取锁重新取queue里的元素
(5)如果在线程2唤醒并获取queue lock之后,在其取走queue里的元素之前线程1已经将元素取走,这个时候线程2就出现了假象唤醒
上述过程就是一个spurious wakeup过程。
那么将代码稍作修改:
std::unique_lock<std::mutex> lk(mutex)while(queue.empty()){ cond_var_.wait(lk); ...}queue.front()用一个循环来查询queue是否可以,即使在条件变量被spurious wakeup的时候获取queue lock之后还是需要去check queue是否为空,这样避免了假象唤醒。
阅读全文
0 0
- C++多线程编程条件变量虚假唤醒(spurious wakeup)
- 多线程编程中的条件变量和虚假唤醒(spurious wakeup)
- 多线程中的条件变量和虚假唤醒(Spurious wakeup)
- 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
- 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
- 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
- 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
- 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
- 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
- spurious wakeup虚假唤醒
- pthread_cond_signal虚假唤醒(spurious wakeup)
- pthread_cond_signal虚假唤醒(spurious wakeup)
- pthread_cond_signal虚假唤醒(spurious wakeup)
- spurious wakeup虚假唤醒(待总结)
- 面试常考点:虚假唤醒 Spurious wakeup
- 条件变量的虚假唤醒(spurious wakeups)问题
- 条件变量的虚假唤醒(spurious wakeups)问题
- 多线程编程中条件变量和虚假唤醒的讨论
- 对linux进程的理解
- JavaScript 定时器 鼠标移入移出div颜色渐变效果
- 第一次写C语言
- PowerDesigner中设置name与code的联动
- oracle 11.2.0.4 ogg for centos6.8安装及数据半同步测试
- C++多线程编程条件变量虚假唤醒(spurious wakeup)
- [C++]使用json库生成与解析json
- LR VS SVM VS RF
- ECharts 图表边距参数设置
- SpringBoot 之Spring Boot Starter依赖包及作用
- 链栈--简单操作
- 第7周项目4-队列数组
- [NA]Lab2:求多项式函数的零点
- 注解