首页IT科技cas9基本原理(基于CAS操作的atomic原子类型)

cas9基本原理(基于CAS操作的atomic原子类型)

时间2025-05-04 00:32:37分类IT科技浏览3286
导读:C++11多线程类库中提供了 include包含了很多原子类型...

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(); } }

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
yolov4 论文(连夜看了30多篇改进YOLO的中文核心期刊 我似乎发现了一个能发论文的规律) vps流程(VPS使用教程:简明易懂的入门指南)