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編譯為這種形式。
i++是否原子操作?並解釋為什麽?
相關推薦
i++是否原子操作?並解釋為什麽?
多核 什麽 cpu 指令 操作 nbsp 解釋 心情 匯編指令 都不是原子操作。理由: 1.i++分為三個階段: 內存到寄存器寄存器自增寫回內存這三個階段中間都可以被中斷分離開. 2.++i首先要看編譯器是怎麽編譯的, 某些編譯器比如VC在非優化版本中會編譯為以下匯編代碼
解釋為什麽word2vec也被稱作deep learning
spa blog 任務 post body 討論 mea com 記得 作者:orangeprince鏈接:https://www.zhihu.com/question/27689129/answer/39117725來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,
用量子物理學原理解釋為什麽振金可以吸收能量(論發散思維的重要性)
用途 src 個人 化學 不同 想象力 次數 由於 錯誤 寫了很多年技術文章,現在也來做做科普,另外,也讓大家體驗下思維的真正力量。知識並不重要,重要的是駕馭知識的能力以及天馬行空的想象力!希望廣大讀者不要將本文當成一篇普通的科普文章,而當做進入思維殿堂的入口。無論讀者從事
轉載 wait(),notify(),notifyAll()用來操作線程為什麽定義在Object類中?
not 調用 存在 await on() 比較 保護 接口 sign 這些方法存在於同步中; 使用這些方法必須標識同步所屬的鎖; 鎖可以是任意對象,所以任意對象調用方法一定定義在Object類中。 Condition是在java 1.5中才出現的,它用來替
面試題【1】:i++是否原子操作?並解釋為什麼?
不是原子操作。理由: 1.i++分為三個階段: 記憶體到暫存器 暫存器自增 寫回記憶體 這三個階段中間都可以被中斷分離開. 2.++i首先要看編譯器是怎麼編譯的, 某些編譯器比如VC在非優化版本中會編譯為以下彙編程式碼: __asm{ moveax, dw
為什麽pymysql執行SQL語句提示成功但實際並沒有操作數據庫?
PyQt5 Python pymysql 開發環境:Anaconda3+PyCharm2018問題:使用pymysql插入數據提示成功,連接數據庫發現並沒有數據。原因:pymysql在連接數據庫的時候會有一個參數autocommit默認為False,表示執行完SQL語句後是否自動提交到真正的數據庫
My app status is Ready for Sale but I cannot see my app on the App Store. Why? 為什麽審核通過後 appstore中搜不到我的app
one soci orm event 什麽 live pstore follow following 這是蘋果的官方解答 The following factors could prevent your app from showing up on the App St
為什麽使用 Arrays.asList()得到的集合,使用remove( )和 add( )方法會拋出unsupportedoperationexception(不支持操作異常)
操作 err move lan 16px exceptio operation amp span 這是由於: Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。 Arrays$ArrayList
Linux為什麽最多能分4個四個主分區的簡單解釋
linux磁盤分區MBR(Master Boot Recorder)主引導記錄,放置硬盤的信息。MBR 可以說是整個硬盤最重要的地方了,因為在 MBR 裏面記錄了兩個重要的東西,分別是:開機管理程序,與磁盤分區表 ( partition table )。所以我們所做的硬盤分區,也就是在修改partition
為什麽操作系統在國產化路上舉步維艱?
linux 操作 系統 現今國產化早已日益普及到每一個人的生活裏,大家不再盲目的崇洋媚外,只要是擁有強硬實力而又跟的上時代創新的產品,皆一視同仁該買就買該用就用。性 價 比 與 實 用 性永 遠 是 衡 量 一 件 產 品 的 根 本 要 素我們先來看看其他的國產化產品的成長歷程國產化知名手機品牌
MyBaits基本操作,為什麽session.commit()可以引起事物提交?ResultMap結果映射,執行添加後返回自增列的值,多條件查詢,智能標簽,工具類
info log list image mit fault 類型 工具類 自增列 1.為什麽session.commit()可以引起事務的提交? 首先打開commit()源碼,ctrl+H打開它的實現類DefaultSession,找到它的commit方法 ctrl+左鍵
學習Linux,為什麽要用虛擬機來操作?
Linux運維 Linux入門 Linux基礎 Linux雲計算 Linux學習 一些初學Linux運維的盆友認為,學習Linux就需要把自己的計算機安裝成Linux系統或需要有真實的服務器設備。其實,初學者可以通過利用虛擬機來學習Linux運維。利用虛擬機軟件搭建Linux學習環境簡單,
Java並發編程(一)-為什麽要並發
是否 退出 line 但是 英雄聯盟 編程 ati 效果 執行順序 並發所帶來的好處 1. 並發在某些情況(並不是所有情況)下可以帶來性能上的提升 1) 提升對CPU的使用效率 提升多核CPU的利用率:一般來說一臺主機上的會有多個CPU核心,我們可以創建多個線程,理論上
總結之提交代碼並部署到服務器上,為什麽代碼卻沒有更新?
jenkins gitlab docker harbor 容器 問題描述: 遇到過幾次這種情況:開發將代碼提交之後,通過打包部署,發現部署到服務器上的代碼不是最新的,還是修改之前的老代碼。 打包部署流程背景說明: gitlab——》jenkins服務器打jar包——》將打好的jar包過濾並
為什麽python的多線程不能利用多核CPU,但是咱們在寫代碼的時候,多線程的確是在並發,而且還比單線程快。
全局 睡眠 read 處理 sleep roc 需要 寫代碼 強制 python裏的多線程是單cpu意義上的多線程,它和多cpu上的多線程有著本質的區別。單cpu多線程:並發多cpu多線程:並行內部包含並發 首先強調背景: 1、GIL是什麽?GIL的全稱是Gl
為什麽三次異或操作可以交換兩個數
找到 原來 們的 異或操作 去掉 進制 ont 交換兩個數 一位 a和b是兩個整數,經過以下三次異或操作,可以達到交換目的:a = a ^ b;b = a ^ b;a = a ^ b; 首先要理解,什麽是^(異或)操作: 二進制兩數運算結果: 0 ^ 0 = 0
為什麽Github要把代碼合並請求稱為pull request而不是push request?
才會 控制 github 更改 fork 過程 answer 答復 而是 問題: 我的理解是:我做了一些修改,我請求把我的修改push到你的倉庫,然後你review一下我的代碼,如果沒問題就接受請求merge,這樣的話叫做push request豈不是更合適?因為這個操作
百雜講堂之為什麽32位系統只能操作4g內存
ont p s strong 不可 什麽 2個 依次 size align 百雜講堂之為什麽32位系統只能操作4g內存 計算機內存中很多的單元,每一個單元就是一個字節,一個字節有8位。每一個單元有兩種狀態:0和1。 所以 兩個單元就有4個組合; 3個單元就有8個組合; 依
元素大小合適,但是卻莫名掉下去了為什麽?關於margin的解釋之一
方法 設置 固定 但是 有時 mar 一行 margin 是我 開發時有時候總會碰到這樣的問題,一行四個元素並排,四個元素的總寬度明明比父級元素的總寬度還要小,但是最後一個元素莫名拍到了下一行,怎麽找都找不到原因。 我找到一個解決方法,雖然不知道是不
java i++ 並非原子操作的解決方法——用AtomicInteger
public class Test1 { private static int a = 0; public static void main(String[] args) throws Inte