zoukankan      html  css  js  c++  java
  • 单生产者和单消费者共同操作同一个消息队列需要加锁吗

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

    それでも私の大好きな人
  • 相关阅读:
    Leetcode#129 Sum Root to Leaf Numbers
    Leetcode#15 3Sum
    Leetcode#16 3Sum Closest
    Leetcode#127 Word Ladder
    Leetcode#2 Add Two Numbers
    Leetcode#18 4Sum
    vue.js入门(3)——组件通信
    vue.js慢速入门(2)
    vue 基础介绍
    vue.js中v-for的使用及索引获取
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/14420573.html
Copyright © 2011-2022 走看看