i++是否原子操作

來源:互聯網
上載者:User

標籤:

i++是否原子操作

不是原子操作。理由:

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

記憶體到寄存器

寄存器自增

回記憶體

這三個階段中間都可以被中斷分離開.

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

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

__asm
{
       moveax,  dword ptr[i]
        inc eax
        movdwordptr[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編譯為這種形式。

注釋:

彙編當中 dword ptr [ ] 是什麼意思

dword 雙字 就是四個位元組
ptr pointer縮寫 即指標
[]裡的資料是一個地址值,這個地址指向一個雙字型資料
比如mov eax, dword ptr [12345678] 把記憶體位址12345678中的雙字型(32位)資料賦給eax

 

i++是否原子操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.