執行緒 二 同步與互斥,死鎖

2021-09-09 00:13:59 字數 2210 閱讀 8981

臨界資源:多執行緒執行流共享的資源

臨界區:訪問臨界資源的**

互斥:任何時刻,有且只有乙個執行流進入臨界區,訪問臨界資源,對臨界資源起保護作用

原子性:不會被任何排程機制打斷的操作

int pthread_mutex_destroy(&mutex);

靜態分配的互斥量不用銷毀,已經加鎖的互斥量不能銷毀,銷毀後的互斥量不會被執行緒嘗試加鎖

如果互斥量處於已鎖狀態,或者沒有競爭到互斥量,那麼pthread_lock呼叫會陷入阻塞(執行流被掛起),等待互斥量解鎖,再次申請。

互斥鎖加鎖是原子的,鎖本身就是臨界資源,鎖本身也需要保護,系統內部採用一條彙編指令,swap或者exchange,功能是交換記憶體和暫存器裡的值,從而保證原子性。解鎖不是原子的

偽**:

lock:

movb $0, %al//把0賦值給暫存器

xchgb %al, mutex//把鎖跟al交換,鎖=0,al=1

if(al暫存器的內容 > 0)

else

unlock:

movb $1, mutex;

return 0;

將mutex跟自己的私有的資料進行了交換,1只有1份。

重入:乙個函式被多個執行流重複進入,前乙個執行流還沒有執行完,就有其他執行流再次進入。在重入的情況下,如果執行結果不會出現任何不同或者任何問題,則該函式被稱為可重入函式,否則就是不可重入函式。

執行緒安全:多個執行緒併發同一段**時,不會出現不同的結果。常見對全域性變數或者靜態變數進行操 作,並且沒有鎖保護的情況下,會出現該問題。 

呼叫了malloc/free函式,,因為malloc函式是用全域性鍊錶來管理堆的 ,鍊錶操作時不可重入的;

一組程序的程序均占有不會釋放的資源,相互申請被其他程序占有的不會釋放的資源而處於一種永久等待的狀態。

多執行緒申請鎖時,申請鎖的順序、方式不妥當,而導致多個執行流當中的乙個或多個執行流不能夠繼續推進的情況。導致程式無作為。

保證資料安全的前提下,執行緒按照某種特定的順序來訪問臨界資源,從而有效避免飢餓問題。引入條件變數。

競態條件:因為時序問題,而導致程式異常,我們稱之為競態條件。

條件變數用來同步,

條件變數介面:

int pthread_cond_init(q&cond, null);

int pthread_cond_destroy(&cond);

int pthread_cond_wait(&cond,&mutex);//釋放鎖,進入等待佇列,mutex中有乙個佇列,條件變數下也有乙個佇列,如果不釋放就會造成死鎖問題。

int pthread_cond_broadcast(&cond);//廣播喚醒所有在該條件變數下等待的執行緒

int pthread_cond_signal(&cond);//通知乙個,執行緒醒來即拿著鎖。

條件變數使用規範:

pthread_mutex_lock(&mutex);

while(條件為假)//此時使用while迴圈,wait函式呼叫失敗,if語句就會直接往後執行,但是此時條件可能並不滿足。

pthread_cond_wait(cond, mutex);

pthread_mutex_unlock(&mutex);

posix訊號量,可以用於執行緒間同步

int sem_init(sem_t *sem, int pshared, int value);第二個引數是0,表示執行緒間共享,非0表示程序間共享

int sem_destroy(sem_t *sem);

int sem_wait(sem_t *sem);等待訊號量,會將訊號量的值-1,p操作

int sem_post(sem_t *sem);發布訊號量,資源使用完畢,歸還資源,訊號量+1,v操作

當前鎖狀態

讀鎖請求

寫鎖請求

無鎖可以

可以讀鎖

可以阻塞

寫鎖阻塞

阻塞**:

#include#include#includeusing namespace std;

int book = 0;

pthread_rwlock_t rwlock;

void* reader(void* arg)

}void* writer(void* arg)

}int main()

執行緒同步與互斥

與多程序互動一樣,各個不同的執行緒之間也會存在資源的共享問題。為了解決多執行緒之間對資源訪問的同步和互斥問題,我們需要了解執行緒同步機制。第一種機制 互斥鎖 互斥鎖是一種簡單的加鎖方法,可以使單個執行緒進行對資源訪問的原子操作。互斥鎖的基本操作就是加鎖和解鎖。互斥鎖主要包含以下函式 1 初始化函式 ...

執行緒同步與互斥

1.執行緒互斥 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行...

執行緒互斥鎖與死鎖

1 首先來了解執行緒的同步與互斥 當多個執行緒訪問同乙個程序時的臨界區時需要被同步與互斥保護避免產生衝突。比如當兩個執行緒都要把某個全域性變數增加1,這個操作在某平台上需要三條指令完成 1,從記憶體讀變數到暫存器。2,暫存器的值加1。3,將暫存器的值寫回記憶體。來看這個程式 2 互斥鎖 先來看mut...