面試題【1】:i++是否原子操作?並解釋為什麼?

十日十乞001發表於2017-06-23

不是原子操作。理由:

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編譯為這種形式。

相關文章