在談volatile關鍵字

2021-08-31 09:26:32 字數 1552 閱讀 7741

在學習c/c++中,我們曾經學習過了乙個關鍵字volatile,我們知道volatile關鍵字的作用是保證記憶體的可見性,但是我們當時在學習的時候例子場景比較有限,例子是單個執行流,因為當時沒有學習過多個執行流執行的情況,所以我們現在可以以多個執行流的**為例子,再次學習volatile關鍵字。

首先我們可以先寫乙個兩個執行流死迴圈的例子:

#include

#include

int flag =0;

void

handler

(int signo)

intmain()

上述例子的執行結果是一直死迴圈直到遇到ctrl+c,即是2號訊號。會跳出迴圈,列印proc done...

我們都知道gcc編譯器可以對**進行優化,有4個優化級別o1、o2、o3、o0,我們可以對此**進行乙個二級優化看結果gcc -o test -o2 test.c

從上邊的結果我們可以看出來對2號訊號的捕捉確實呼叫了handler函式,所以flag也確實改變為1了,但是為什麼迴圈沒有結束呢?這個現象就可以說明main執行流在使用flag變數的時候不是從記憶體中去拿的,而是直接從暫存器中拿出來的,當我們採用二級優化編譯的時候,編譯器會將不修改而且經常呼叫的變數放到編譯器中(編譯器只會看到乙個執行流既main中flag不會改變,handler執行流不會影響)main執行流每次使用的flag時候的時候就直接從暫存器中拿,而不是從記憶體中直接拿來用,雖然記憶體中的值改變了,但是卻不影響暫存器中的值。

所以,這裡我們可以加上volatile關鍵字,保證記憶體的可見性,防止編譯器對**產生優化,每次使用flag的時候直接從記憶體中拿來使用。

修改上述**,加上volatile關鍵字:

#include

#include

int flag =0;

volatile

void

handler

(int signo)

intmain()

執行結果為:

這樣就可以得到我們想要的結果

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...

關鍵字volatile詳解

與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...

volatile關鍵字 詳解

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