多個執行緒同時訪問共享資料時可能會衝突,這跟前面講訊號時所說的可重入性是同樣的問
題。比如 兩個執行緒都要把某個全域性變數增加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排程的物件,是乙個動態的概念。乙個程序之中至少包含有乙個或者多個執行緒。這些執行緒共享該程序空間的記憶體和檔案控制代碼資源,多個執行緒競爭地獲得這些資源。為了防止多個執行緒訪...