執行緒的同步與互斥

2021-08-18 20:13:38 字數 3747 閱讀 9424

一、mutex(互斥量)

·多個執行緒併發的操作共享變數,會帶來問題

例:操作共享變數會有問題的售票系統

為什麼會對賣3張呢?

·if語句判斷條件為真以後,**可以併發的切換到其他執行緒

·sleep這個模擬漫長業務過程,在這個漫長的過程中,可能有其他很多的執行緒進入該**段

·--ticket操作本身就不是乙個原子操作

--操作並不是原子操作,而是對應三條彙編指令

·load:將共享變數ticket從記憶體載入到暫存器中

·update:更新暫存器裡面的值,執行-1操作

解決上面問題就必須做到:

·**必須要有互斥行為,當**進入臨界區執行時,不允許其他執行緒進入該臨界區

·如果多個執行緒同時要求執行臨界區的**,並且臨界區沒有執行緒在執行,那麼只能允許乙個執行緒進入該臨界區

·如果執行緒不在臨界區中執行,那麼該執行緒不能阻止其他執行緒進入臨界區

要做到這三點就必須要有一把鎖。linux上提供的這把鎖叫互斥量

二、互斥量的介面

1、初始化

方法一:靜態分配

pthread_mutex_t mutex = pthread_mutex_initializer;
方法二:動態分配

引數:mutex——要初始化的互斥量

attr——null

2、銷毀互斥量

注意:·使用pthread_mutex_initializer初始化的互斥量不需要銷毀、

·不要銷毀乙個已經加鎖的互斥量

·已經銷毀的互斥量,要確保後面不會有執行緒嘗試加鎖

3、互斥量加鎖和解鎖

返回值:成功返回0,失敗返回錯誤碼

呼叫pthread_mutex_lock會遇到的情況:

·互斥量處於未鎖狀態,該函式會將互斥量鎖定,同時成功返回

·發起函式呼叫時,其他執行緒已經鎖住互斥量,或者存在其他執行緒同時申請互斥量,但沒有競爭到互斥量,那麼pthread_lock呼叫會陷入阻塞,等待互斥量解鎖

改進上面的售票**

三、條件變數

·當乙個執行緒互斥的訪問某個變數時,它可能發現在其它執行緒改變狀態之前,它什麼也做不了

·例如乙個執行緒訪問佇列時,發現隊列為空,它只能等,只到其它執行緒將乙個節點新增到佇列中。這種情況就需要用到條件變數

條件變數函式

1、初始化

引數:cond——要初始化的條件變數

attr——null

2、銷毀

3、等待條件滿足

引數:cond——要在這個條件變數上等待

mutex——互斥量

4、喚醒等待

23 pthread_cond_wait需要互斥量的原因:

(1)條件等待是執行緒間同步的一種手段,如果只有乙個執行緒,條件不滿足,一直等下去都不會滿足,所以必須要有乙個執行緒通過某些操作,改變共享變數,使原先不滿足的條件變得滿足,並且友好的通知等待在條件變數上的執行緒

(2)條件變數不會無緣無故的突然就滿足了,必然會牽扯到共享資料的變化。所以一定要用互斥鎖來保護。沒有互斥鎖就無法安全的獲取和修改共享資料

按照上面的說法,我們設計出:先上鎖,發現條件不滿足,解鎖,然後等待條件變數上

//錯誤的設計

pthread_mutex_lock(&mutex);

while(condition)

pthread_mutex_unlock(&mutex);

·由於解鎖和等待不是原子操作。呼叫解鎖之後pthread_mutex_unlock之前,如果已經有其他執行緒獲取到互斥量,摒棄條件滿足,傳送了訊號,那麼pthread_cond_wait將錯過這個訊號,可能會導致執行緒永遠阻塞在這個pthread_cond_wait。所以解鎖和等待必須是原子操作

·int pthread_cond_wait(pthrad_cond_t *cond,pthread_mutex_t *mutex);進入該函式後,會去看條件變數等於0不?等於,把互斥量變為1,直到cond_wait返回,把條件變數改為1,把互斥量恢復成原來的樣子

五、條件變數的使用範圍

1、等待條件**

pthread_mutex_lock(&mutex)

while(條件為假)

pthread_cond_waiit(cond,mutex);

修改條件

pthread_mutex_unlock(&mutex);

2、給條件傳送訊號**

pthread_mutex_lock(&mutex);

設定條件

pthread_cond_signal(cond);

pthread_mutex_unclock(&mutex);

執行緒同步與互斥

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

執行緒同步與互斥

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

執行緒的同步與互斥

進行多執行緒程式設計,因為無法知道哪個執行緒會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決 執行緒之間對資源的競爭 1.互斥量mutex 2.訊號燈semaphore 3.條件變數 conditions mutex 互斥鎖線程控制 1 互斥鎖是用一種...