多线程一条汇编指令是原子指令吗?不一定,比如add dword ptr[i],1不是,因为可以拆分成多个步骤,先把i的值从内存读到寄存器,寄存器经过运算器加1最后才把寄存器的值写会。而mov eax,ecx就是,区别是对内存操作一次以上就不是,操作0或1次就是,通过atomic原子变量,对该变量读或修改时,很大可能生成原子指令(伪原子),本质是加上指令前缀lock,对内存总线锁住。如果针对比较后等于原先预定值,才能对其修改,比如原先饼干是有5包的,但读取出来是4包证明被人偷了,这种情况下则不吃那么快去找人算账,即自身不修改为3,退出执行。C语言提供cas函数(全程compare and swap),把几条操作都锁定下来。如果只用atomic则多条指令单个是原子的,但几个加起来就不是原子的。
mutex互斥锁在判断锁变量是否被其他线程占用时也用到了原子锁。
简单理解多线程原子指令与CAS
最新推荐文章于 2024-11-11 23:32:39 发布
文章讨论了汇编指令如adddwordptr[i],1的非原子性,强调了像moveax,ecx这样的操作是原子的。文中提到使用atomic变量、CAS函数和lock指令前缀来实现伪原子操作,以及mutex锁如何利用原子操作检测线程占用。
摘要由CSDN通过智能技术生成