linux多執行緒中的共享變數

2021-05-24 01:27:39 字數 1849 閱讀 5423

當解決多執行緒互斥同步的問題時,經常會有如下幾個問題:

1. 在乙個給定的問題中,需要多少個mutex,多少個semaphore?有什麼規律?

2. 在對臨界區加鎖和等待訊號量的順序上有什麼要求和規律?

3. 什麼樣操作適合放在臨界區,什麼樣的不適合?

下面就生產者和消費者問題來分析一些這幾個問題.

下面是乙個簡單的實現程式:

生產者向陣列sharedarray中寫入資料,而消費者從該陣列中讀取資料.

#include

#include

#include

#include

#define maxsize  5               /*共享緩衝區的大小*/

int sharedarray[maxsize];        /*sharedarray是共享緩衝區*/

int curr=-1;                     /*curr是用來指定sharedarray當前存有資料的最大位置*/

/*注意,sharedarray和curr都屬於共享資料*/

int empty=0;            

int full=maxsize;

pthread_mutex_t sharedmutex=pthread_mutex_initializer; /*鎖定臨界區的mutex*/

sem_t waitnonempty, waitnonfull; /*等待"非空資源"和等待"非滿資源"的semaphor*/

void * readdata(void * whichone)

}void * writedata(void * whichone)

}int main (int argc, char** argv)

分析和說明:

1. 在乙個給定的問題中,需要多少個mutex,多少個semaphore?有什麼規律?

在本問題中,共需要乙個mutex和兩個semaphore.

其中,mutex是用來鎖定臨界區的,以解決對共享資料的互斥訪問問題(無論是對生成者還是對消費者);

我們共需要兩個semaphore,這是因為在本問題中共有兩個稀缺資源.

第一種是"非空"這種資源,是在消費者之間進行競爭的.

第二種是"非滿"這種資源,是在生產者之間進行競爭的.

所以,一般來說,需要鎖定臨界區,就需要mutex;有幾種稀缺資源就需要幾個semaphore.

對稀缺資源的分析不能想當然.稀缺資源不一定是指被共享的資源,很多時候是指執行緒會被阻塞的條件(除了要進臨界區被阻塞外).

本例中,消費者會在緩衝區為空時被阻塞,所以"非空"是一種稀缺資源;

生產者會在緩衝區為滿時被阻塞,所以"非滿"也是一種稀缺資源.

2. 在對臨界區加鎖和等待訊號量的順序上有什麼要求和規律?

這裡要說兩點:

第一,不要將等待訊號量的語句放在被鎖定的臨界區內,這樣會造成死鎖.而且這也是很沒有必要的.

比如,消費者在緩衝區沒有資料的時候進入臨界區,這樣就會把臨界區鎖上,由於沒有資料,消費者也會被鎖上.

這時,任何生產者都會由於臨界區被鎖上而被block住,這樣就造成了死鎖.

第二,如果有多個semaphore需要等待,那麼每個執行緒中,最好對這多個訊號量進行等待的順序一致,

不然的話很容易造成死鎖.

3.  什麼樣操作適合放在臨界區,什麼樣的不適合?

一般來說,臨界區中只放對共享資料進行訪問的語句,這樣會改善程式的效能.

很多時候,取出共享資料的副本後,對副本進行費時的各種操作就不需要放在臨界區了.

比如,本例中的sleep語句就根本不需要放入臨界區.

多執行緒共享變數 多執行緒共享全域性變數

1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...

多執行緒共享變數

題目如下 設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。如果每個執行緒執行的 相同 可以使用同乙個runnable物件,這樣在不同的執行緒中只需要把這個runnable物件傳到裡面去即可,因為runnable物件的run方法天熱原子性,不可能run方法被打斷,乙個run...

多執行緒共享變數

from threading import thread,lock global num 0 def func1 global global num 全域性變數 for i in range 1000000 lock.acquire 兩個執行緒會最開始搶這個鎖,拿到鎖就會處於關鎖,執行後面的程式,其...