Linux環境下執行緒的互斥

2021-07-29 12:15:48 字數 1090 閱讀 2996

多個執行緒同時訪問共享資料時可能會衝突,這跟前面講訊號時所說的可重入性是同樣的問

題。比如 兩個執行緒都要把某個全域性變數增加1,這個操作在某平台需要三條指令完成:

1. 從記憶體讀變數值到暫存器

2. 暫存器的值加1

3. 將暫存器的值寫回記憶體

假設兩個執行緒在多處理器平台上同時執行這三條指令,則可能導致下圖所示的結果,最後變數

只加了一次而非兩次。

通過乙個簡單的程式觀察這一現象。描述的現象從理論上是存在這種可能的,但實際執行程式時很難觀察到,為了使現象更容易觀察到,我們把上述三條指令做的事情用更多條指令來做:

我們在「讀取變數的值」和「把變數的新值儲存回去」這兩步操作之間插入乙個printf呼叫,它會執行write系統呼叫進核心,為核心排程別的執行緒執行提供了乙個很好的時機。我們在乙個迴圈中重 復上述操作幾千次,就會觀察到訪問衝突的現象。

我們建立兩個執行緒,各自把counter增加5000次,正常情況下最後counter應該等於10000,但事實

上每次執行該程式的結果都不一樣,有時候數到5000多,有時候數到6000多。

對於多執行緒的程式,訪問衝突的問題是很普遍的,解決的辦法是引入互斥鎖(mutex,mutual  exclusive lock),獲得鎖的執行緒可以完成「讀-修改-寫」的操作,然後釋放鎖給其它執行緒,沒有獲得鎖的執行緒只能等待而不能訪問共享資料,這樣「讀-修改-寫」三步操作組成乙個原子操作,要麼都執行,要麼都不執行,不會執行到中間被打斷,也不會在其它處理器上並行做這個操作。

#include#include#includestatic int count=0;

pthread_mutex_t mutex=pthread_mutex_initializer;

void *thread_run(void *arg)

return null;

}int main()

if(temp2!=0)

pthread_join(id1,null);

pthread_join(id2,null);

printf("count val = %d\n",count);

return 0;

}

八 Linux下執行緒的互斥

為什麼使用執行緒鎖?在多執行緒應用程式中,當多個執行緒共享相同的記憶體時,如同時訪問乙個變數時,需要確保每個執行緒看到一致的資料檢視,即保證所有執行緒對資料的修改是一致的。如下兩種情況不存在不一致的問題 每個執行緒使用的變數都是其他執行緒不會讀取和修改的 變數是唯讀的 當乙個執行緒在修改變數的值時,...

linux下執行緒同步之互斥鎖

互斥鎖是多執行緒同步的一種方式,當多個執行緒訪問同乙個變數時,最簡單的方法就是使用乙個互斥鎖 mutex 保護這個共享變數,防止出現資源搶占的問題。下面是未加互斥鎖時 include includepthread mutex t mutex pthread mutex initializer 靜態初...

Linux下執行緒同步物件 1 互斥量

程序是linux資源分配的物件,linux會為程序分配虛擬記憶體 4g 和檔案控制代碼等資源,是乙個靜態的概念。執行緒是cpu排程的物件,是乙個動態的概念。乙個程序之中至少包含有乙個或者多個執行緒。這些執行緒共享該程序空間的記憶體和檔案控制代碼資源,多個執行緒競爭地獲得這些資源。為了防止多個執行緒訪...