1. 程式人生 > >i++是否原子操作?並解釋為什麽?

i++是否原子操作?並解釋為什麽?

多核 什麽 cpu 指令 操作 nbsp 解釋 心情 匯編指令

都不是原子操作。理由:

1.i++分為三個階段:

內存到寄存器
寄存器自增
寫回內存
這三個階段中間都可以被中斷分離開.

2.++i首先要看編譯器是怎麽編譯的

某些編譯器比如VC在非優化版本中會編譯為以下匯編代碼:

__asm
{
moveax, dword ptr[i]
inc eax
mov dwordptr[i], eax
}
這種情況下,必定不是原子操作,不加鎖互斥是不行的。
假設加了優化參數,那麽是否一定會編譯為“inc dword ptr[i]”呢?答案是否定的,這要看編譯器心情,如果++i的結果還要被使用的話,那麽一定不會被編譯為“inc dword ptr[i]”的形式。
那麽假設如果編譯成了“inc dword ptr[i]”,這是原子操作,是否就不需要加鎖了呢?如果在單核機器上,不加鎖不會有問題,但到了多核機器上,這個不加鎖同樣會帶來嚴重後果,兩個CPU可以同時執行inc指令,但是兩個執行以後,卻可能出現只自加了一次。
真正可以確保不“額外”加鎖的匯編指令是“lock inc dword ptr[i]”,lock前綴可以暫時鎖住總線,這時候其他CPU是無法訪問相應數據的。但是目前沒有任何一個編譯器會將++int編譯為這種形式。

i++是否原子操作?並解釋為什麽?