面試題【1】: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編譯為這種形式。
相關文章
- 什麼是原子操作?Java如何實現原子操作?Java
- 面試題。為什麼輸出BBBBB?面試題
- 原子操作 vs 非原子操作
- 如何通俗解釋Docker是什麼_1Docker
- Redis 中的原子操作(1)-Redis 中命令的原子性Redis
- 面試題:請解釋一下什麼是虛擬記憶體?面試題記憶體
- 機器學習可解釋性系列 - 是什麼&為什麼&怎麼做機器學習
- 面試題:MySQL索引為什麼用B+樹?面試題MySql索引
- 原子操作
- 原子操作與原子型別型別
- Go語言原子操作及互斥鎖,有什麼區別呢?Go
- 4 張動圖解釋為什麼(什麼時候)使用 Redux圖解Redux
- 關於java的“原子操作”問題Java
- 用程式碼解釋為什麼要用 '單例'單例
- CAS 原子操作
- 漫話:給女朋友解釋為什麼隨機播放歌曲並不隨機隨機
- Java面試題:為什麼HashMap不建議使用物件作為Key?Java面試題HashMap物件
- Mysql為什麼多個大版本並行釋出的個人理解MySql並行
- 面試困惑解答:為什麼跳槽面試
- []==''返回?為什麼?運算子==進行了什麼操作?
- 如何給女朋友解釋什麼是併發和並行並行
- 為什麼說DOM操作很慢
- C++原子操作與記憶體序 1C++記憶體
- 面試送命題,你為什麼從上家公司離職?面試
- 【Java面試】Redis存線上程安全問題嗎?為什麼?Java面試Redis
- Service Mesh是什麼,為我們解決了什麼問題?
- 【Java面試】什麼是可重入,什麼是可重入鎖? 它用來解決什麼問題?Java面試
- 【Java面試】什麼是 ISR,為什麼需要引入 ISRJava面試
- 圖解|12張圖解釋MySQL主鍵查詢為什麼這麼快圖解MySql
- 面試題:連結串列為什麼使用內部類實現?面試題
- 陳皓:為什麼我反對純演算法面試題演算法面試題
- 為什麼我們不用智力題來面試程式設計師面試程式設計師
- 為什麼量子計算如此難以解釋? - quantamagazine
- Google 開源主管解釋為什麼開源“殘酷”Go
- Nginx 常用面試題-什麼是NginxNginx面試題
- 漫話:如何給女朋友解釋什麼是併發和並行並行
- 為什麼想來我們公司工作?- 面試常見問題解析面試
- 死磕 java原子類之終結篇(面試題)Java面試題