OS / 理论 / 什么是原子操作?
生活随笔
收集整理的這篇文章主要介紹了
OS / 理论 / 什么是原子操作?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
(1)++i 和 i++ 是否是原子操作?答案:不是。
匯編代碼如下:
步驟如下:
(1)變量 i 值由內(nèi)存拷貝到寄存器 eax 中。
(2)寄存器 eax 自增 1 。
(3)將寄存器 eax 中的值寫入內(nèi)存中。
所以,++i 和 i++ 不是原子操作。
(2)int a = b 是否是原子操作?答案:不是。
因為由于現(xiàn)代計算機(jī) CPU 架構(gòu)體系的限制,數(shù)據(jù)不可以直接從內(nèi)存搬運(yùn)到另外一塊內(nèi)存,必須借助寄存器中斷。所以這條語句一般對應(yīng)兩條計算機(jī)指令,即將變量b的值搬運(yùn)到某個寄存器(如 eax )中,再從該寄存器搬運(yùn)到變量 a 的內(nèi)存地址。
栗子:
int a = 100; int b = 997; a = b;匯編代碼如下:
movl $100, -8(%rbp) ; 將 100 賦值給 a 。 movl $997, -4(%rbp) ; 將 997 賦值給 b 。 movl -4(%rbp), %eax ; 將 b 賦值給 寄存器 eax 。 movl %eax, -8(%rbp) ; 將 寄存器 eax 賦值給 a 。上述后兩條指令就是 a = b 的匯編代碼,所以就有可能第一條指令執(zhí)行完畢之后,被 OS 上下文切換,所以該代碼也不是線程安全的。
?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的OS / 理论 / 什么是原子操作?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/Cpp / typeof、_type
- 下一篇: 进程有一个全局变量 i,还有有两个线程。