单生产者和单消费者共同操作同一个消息队列需要加锁吗

单生产者和单消费者的情况下可以不要锁,但是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来保证正确性。

posted @ 2021-02-20 14:10  阿玛尼迪迪  阅读(830)  评论(0编辑  收藏  举报