i++是否原子操作?並解釋爲什麼?

不是原子操作。理由:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章