单生产者和单消费者共同操作同一个消息队列需要加锁吗
2023-09-11 14:15:22 时间
单生产者和单消费者的情况下可以不要锁,但是memory barrier还是需要的。
考虑下面一个简单的情况,初始时,data未初始化,flag = 0;
生产者线程:
data = 1; flag = 1;
消费者线程:
while(!flag) {}; read data;
这段代码意思是消费者等到生产者把flag置为1后才去读data的值,那么读到的肯定是正确的结果对吧?但是现代的CPU做了各种优化,结果就是并不保证会按照编写的顺序去读写data和flag的值。
所以可能出现先写flag,再写data,或者先读data,再读flag。这种乱序可以保证在单线程情况下一定不会有问题,但是在多线程情况下,生产者中的flag = 1可能先于data = 1执行,执行完flag = 1后,data = 1之前,轮到消费者线程执行,此时判断flag = 1,然后去读data的值,会读到未初始化的data,需要加memory barrier来保证正确性。
相关文章
- C#微信公众号开发系列教程三(消息体签名及加解密)
- Unity3D研究院之IOS本地消息通知LocalNotification的使用
- C#消息队列(RabbitMQ)零基础从入门到实战演练
- 通过内存盘提高MSMQ的消息吞吐能力
- Linux进程间通信(七):消息队列 msgget()、msgsend()、msgrcv()、msgctl()
- 【消息队列】关于消息队列的优缺点
- PHP 消息队列 Kafka 使用
- [sip]SIP多方会话消息之实例讲解
- JAVA消息服务JMS规范及原理详解
- 小程序 订阅消息功能实现 wx.requestSubscribeMessage
- Canal订阅binlog变更并结合kafka实现消息缓冲
- RabbitMQ消息队列(九):Publisher的消息确认机制
- ActiveMQ消息队列
- Kafka,Mq,Redis作为消息队列使用时的差异?
- WebService出错 Maximum message size quota for incoming messages (65536) has been exceeded.已超过传入消息(65536)的最大消息大小配额
- 错误消息sales area is not assigned for the header product
- SAP C4C的一个错误消息 - Security token does not match
- 阿里云上git clone公司内网仓库遇到的错误消息 - cannot resolve host
- atitit.极光消息推送服务器端开发实现推送 jpush v3. 总结o7p
- 极光JPush cordova android平台收不到系统消息
- 【成为架构师课程系列】消息队列:秒杀时如何处理每秒上万次的下单请求?
- Linux下的多进程通信(IPC)原理及实现方案(管道-消息队列-信号量-共享内存-套接字)
- 时间>金钱【抱歉,博客消息未及时回复,可直接加Q316187205】
- RabbitMQ消息队列基础概念、原理学习
- 【云原生 | 27】Docker部署运行开源消息队列实现RabbitMQ
- 第二人生的源码分析(三十七)消息处理的完整流程
- 消息队列的简单理解与各种消息队列的对比
- 【RabbitMQ笔记01】Windows搭建RabbitMQ消息队列基础运行环境
- 【redis】 属于redis的 “消息队列”:redis stream(浅析)
- RT-Thread之消息队列