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来保证正确性。

    それでも私の大好きな人
  • 相关阅读:
    Mysql多表查询
    Mysql单表查询
    初始mysql语句
    MySql安装和基本管理
    jQuery的ajax
    关于DOM操作的相关案例
    DOM介绍
    关于DOM的事件操作
    使用正则写一个计算器

  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/14420573.html
Copyright © 2011-2022 走看看