C中volatile為什麼不能保障原子性,或者什麼情況下能保障原子性,分不多,問題

時間 2022-04-19 16:05:08

1樓:匿名使用者

volatile與是不是原子性沒有關係。

首先從根本上說一下為何需要valotile:volatile關鍵字告訴編譯器每次訪問此變數時都要從實際記憶體中讀取,因為記憶體的硬體結構中,每個儲存單元都有一個叫s-amp(sense amplifier,讀出放大器)的東西,這個東西在儲存單元狀態改變時(比如0 -> 1)會保持資料的邏輯狀態,起到一個cache的作用,只要之後儲存單元狀態沒再改變,cpu再次過來讀取時它會直接將cache值傳送出去,這樣做的好處是省去了記憶體定址過程,提高資料傳輸速度,而volatile轉換到硬體層就是不是用s-amp的cache作用,還是每次都重新定址,重新讀取。

至於原子性,不知lz何意,因為確實跟volatile扯不上關係

2樓:

volatile就是不保證原子的,

它只是保證每次都做真實的資料訪問,編譯器不去優化它

要實現原子性,或者加鎖,或者用平臺相關的彙編**

3樓:匿名使用者

#include

int main()

linux gunc 下執行-》

3 3 // 左++,單純變數表示式不馬上輸出,保留(運算仍有效),全部算完一次輸出.

3 23 2

2 2 //右++ 為了避免隱患,是多次自增也只是自增一次

j**a volatile變數為什麼不能保證原子性

4樓:gta小雞

被volatile修飾的變數保證的是可見性,不是原子性。這是兩個不同的概念。

可見性是指不論在哪個執行緒中看,同一個物件同一時刻的值總是一樣的,不會出現不一致的情況。

原子性是指一個操作要麼完成,要麼沒有完成,不會出現完成了一半的情況。

c語言中volatile在什麼情況下使用

5樓:

簡單的說,你所定義的這個變數,在你程式執行過程中一直會變,你希望這個值被正確的處理,你就得每次從記憶體中去讀這個值,這樣就不會有錯誤了,這個volatile就是這個作用了。

6樓:

簡單的理解就是這個變數可能會被外部函式改變,為了讓這個改變能有效執行,不被編譯器優化掉。

舉個例子吧,一個函式用了一個外部的變數,但這個變數在此函式中沒有改變,只是引用,這時候編譯器會去做優化,把它的值暫放在內部暫存器中,用的時候讀取的是暫存器的值,而不是去訪問它的地址取值,這樣的話,當這個變數在外部發生了變化的時候,比如中斷,或者另外的程序等等。但在這個函式裡面就不能起作用,因為被優化後使用的是暫存器的值,還是原來的值,導致錯誤發生。這種情況下,就要加上這個定義,就不會被優化了。

7樓:匿名使用者

volatile是易變的,不穩定的意思,volatile是關鍵字,是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比如作業系統、硬體或者其他執行緒等,遇到這個關鍵字宣告的變數,編譯器對訪問該變數的**不在進行優化,從而可以提供對特殊地址的穩定訪問。

volatile 關鍵字告訴編譯器該變數是隨時可能發生變化的,每次使用它的時候必須從記憶體中取出他的值,因而編譯器生成的彙編**會從原記憶體地址中讀取資料使用。

如果一個暫存器或者變數表示一個埠或者多個執行緒的共享資料,就容易出錯,所以volatile可以保證對特殊地址的穩定訪問。

c語言中volatile關鍵字是什麼含義怎麼辦呢

影者東昇 c c 中的 volatile 關鍵字和 const 對應,用來修飾變數,通常用於建立語言級別的 memory barrier。volatile 關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編...

c 中為什麼陣列地址可以作為引數傳遞而不能直接賦值給別的陣列呢

這是甲魚的臀部 規定.因為陣列名錶示陣列的首地址,int b它要定義自己的陣列空間,當然不能用別的陣列的空間,所以不能把a傳給它.但陣列作為引數傳遞時,array只是個臨時指標變數,函式還是直接對實引數組進行操作,不需要另外生成陣列.樓上兩位說的a的指標,其實就是陣列首元素的指標,即陣列首地址,只不...

維生素C為什麼不能多吃,維C能多吃嗎?

維生素c是無毒的營養素,但每天攝入量超過8克會有害,症狀包括 噁心 腹部痙攣 腹瀉 鐵的過量吸收 紅細胞破壞 骨骼礦物質代謝增強 妨礙抗凝劑的 血漿膽固醇升高,並可能對大劑量維生素c形成依賴。大劑量服用維生素c,可以導致溶血,嚴重者可能會致命。人體的細胞和組織長期泡在高濃度的維生素c裡,會適應了這種...