linux c多執行緒程式設計之全域性變數訪問操作

2021-09-22 10:13:29 字數 600 閱讀 6622

參考文章1:

假設現在有執行緒a和執行緒b,還有全域性變數i,暫存器x

1、執行緒對全域性變數的訪問時分三步走的 :

(1)取全域性變數i到某個暫存器x

(2)對暫存器進行操作,即操作i的值

(3)操作完之後將暫存器x的值存到i

2、多執行緒實際上是由時間片選來輪換進行的。當執行緒a執行到某個地方還沒結束的時候,可能就會輪換到執行緒b來執行。

3、總和上述兩點,當執行緒a訪問變數i的時候,可能只到了第(2)小步,就輪換到執行緒b了。

舉個例子:

執行緒a :

int i = 1;

i++執行緒b:

--i執行過程順序如下:

最終的結果可能是0或者1或者2。

小結:如果多執行緒裡面的共享變數(整型變數、鍊錶等等)是需要都進行運算且被重新賦值的,一定要加執行緒鎖,保證執行順序。加了鎖,保證乙個執行緒的該部分訪問完再訪問其他執行緒的,這就叫原子性。需要靠加鎖來保證原子性操作。那麼,如果變數的運算只在乙個執行緒裡面,其他執行緒只是取這些值做判斷而且是迴圈性質的判斷,那可以不用加。

linux C 多執行緒程式設計

1.solaris vs.linux posix 庫 solaris 庫 lib 執行緒 linux posix 庫 libp 執行緒 操作sema destroy sem destroy 銷毀訊號狀態。sema init sem init 初始化訊號。sema post sem post 增加訊號...

linux C 多執行緒程式設計

1.solaris vs.linux posix 庫 solaris 庫 lib 執行緒 linux posix 庫 libp 執行緒 操作sema destroy sem destroy 銷毀訊號狀態。sema init sem init 初始化訊號。sema post sem post 增加訊號...

Linux C中多執行緒與volatile變數

linux c中多執行緒與volatile變數 volatile 修飾的變數表示改變量的值是易mttrvbdam變的,編譯器不對其進行優化,訪問該變數的時候不會從暫存器讀取,而是直接從記憶體讀取變數。在多執行緒環境下,每個執行緒都有乙個獨立的暫存器,用於儲存當前執行的指令。假設我們定義了乙個全域性變...