<五>基于CAS操作的atomic原子类型
  xs9mrAcZVTZn 2023年11月02日 20 0
C++

C++11多线程类库中提供了
include 包含了很多原子类型

原子操作
若干汇编指令具有读-修改-写类型,也就是说它们访问存储器单元两次,第一次读原值,第二次写新值

假定运行在两个cpu上的两个内核控制路径试图通过执行非原子操作来同时读-修改-写同一个存储器。
首先两个cpu都试图读同一单元,然后使用不同的方式修改读取的内容之后将其写入该存储单元。
虽然最终两个写操作都会成功,但是全局结果是不对的,因为两个CPU写入同一内存单元,因此两个交错的读-修改-写操作成了一个单独的操作

避免由于"读-修改-写"指令引起的竞争条件的最容易的办法就是确保这样的操作在芯片级是原子的,任何一个这样的操作度必须以单个指令执行,中间不能中断,且避免其他的CPU访问同一存储器单元,这样很小的原子操作可以建立在其它更灵活机制的基础上以创建临界区。

窗口卖票案例中的 ticketCount++ ;ticketCount--不是线程安全的
我们原来是通过lock_guard(互斥锁) 来保证的
互斥锁是比较重的,对临界区代码做得事情稍微复杂,多的情况下 OK的.
但是对一些简单的情况,我们可以使用CAS来保证上面的 ++ --操作的原子特性就足够了,无需锁来操作.

C++11中的 automic头文件中包含了很多原子操作

volatile std::automic_bool isReadu=false;//volatile  不读缓冲中的值
volatile std::automic_int  mycount=0;


void task(){
    while(!isReady){
        std::this_thread::yied();//线程出让当前的cpu时间片,等待下一次调度
    }

    for(int i=0;i<100;i++){
        mycount++;
    }
}


int main(){
    list<std::thread> tlist;
    for(int i=0;i<3;i++){
      tlist.push_back(std::thread(task));
    }

    std::this_thread::sleep_for(std::chrono::sedonds(3));
    isReady=true;
    for(std::thread &t : tlist){
         t.join();
    }
 
}

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   82   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   58   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   44   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   62   0   0 C++
xs9mrAcZVTZn