一、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 互斥鎖是用一種...