併發中的原子性問題

2021-09-24 02:57:33 字數 549 閱讀 7265

高階語言的程式中,一條程式**,可能對應多個cpu指令,而原子性,即指乙個或多個操作在cpu中執行的過程中不被中斷,稱為「原子性」。

而因為原子性出現的bug的原因是因為執行緒切換,即指乙個變數的讀取操作在cpu中可能存在多個執行緒同一時間執行不同的順序,導致值的不對。

怎麼解決這個問題呢?原子性問題的根源,就是因為cpu中斷,那麼禁止執行緒切換,不就能夠解決這個問題,而禁止cpu發生中斷就能禁止執行緒切換。

而在多核cpu上,同一時間執行同一段**,禁止執行緒切換,代表cpu執行**不會中斷,但是,同時不能保證同一時刻只有乙個執行緒執行。如果兩個執行緒同時對乙個共享變數操作,那麼還是會存在併發性問題。

那怎麼保證不存在多個執行緒執行同一段**,答案就是互斥。保障同一段**只有乙個cpu執行。解決辦法就是:加鎖。

即synchronize關鍵字,主要理解好,我們的鎖和我們所保護的資源的關係弄清楚。即鎖來自**,它保護誰,一般情況下都會弄錯,即a鎖保護b的資源。多個資源怎麼保護,這個時候弄清楚資源之間的關係,是共用一把鎖保護,還是分開用多個鎖保護。

這是保證互斥的關鍵。

併發程式設計中的原子性問題,可見性問題,有序性問題。

原子性問題 在乙個執行緒中,對乙個32的二進位制數進行賦值操作,當低16位的資料寫入後,發生了中斷,而此時又有乙個執行緒去讀取這個寫入的資料,必定得到的是乙個錯誤的資料。在j a中這種情況是不存在的,因為對基本資料型別的寫入和賦值保證了原子性 i 10 但僅限制於對基本資料型別,而變數的賦值就不能保...

互斥鎖 解決原子性問題

原子性 乙個或多個操作在cpu執行的過程中不被中斷的特性 原子性問題的源頭是執行緒切換,作業系統做執行緒切換依賴於cpu中斷,所以禁止cpu中斷就能禁止執行緒切換。示例 在32位cpu上執行long型別變數的寫操作,long型別變數是64位,所以會被拆分為兩次寫操作 寫高32位和寫低32位 1.單核...

處理併發性問題

多使用者客戶端 伺服器應用程式中的併發性 資料處理的策略 處理併發性問題的若干種方法 1 保守方式 這種併發性模型在資料上加了鎖。如果乙個使用者已經開啟了一條記錄,那麼在允許編輯的環境中,系統就會拒絕來自其他使用者的讀取資料的請求。2 開放方式 在開放的併發模型中,總是允許使用者讀取資料,甚至還可能...