面試題【1】:i++是否原子操做?並解釋爲何?

不是原子操做。理由: 優化

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

http://blog.csdn.net/yeyuangen/article/details/19612795 編譯器

相關文章
相關標籤/搜索