不是原子操做。理由: 優化
1.i++分爲三個階段: spa
內存到寄存器
寄存器自增
寫回內存
這三個階段中間均可以被中斷分離開. .net
2.++i首先要看編譯器是怎麼編譯的, blog
某些編譯器好比VC在非優化版本中會編譯爲如下彙編代碼: 內存
__asm
{
mov eax, 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編譯爲這種形式。 get