多個執行緒併發的操作共享變數,會帶來⼀些問題。
假設兩個執行緒讀寫相同變數時,執行緒a讀取變數然後給這個變數賦予乙個新的值,但寫操作需要兩個儲存週期。當執行緒b在這兩個寫週期讀取這個變數時,可能會得到不一致的值。為了避免這個問題,就需要互斥,同一時間只允許乙個執行緒訪問該變數。
假設乙個場景,現有100張車票,新建4個執行緒連續不斷進行買票,直到票售完。我們先看**與執行結果:
#include#include#include#include#includeint ticket = 100;
void* route(void* arg)
else
}
}int main()
執行結果截圖:
我們可以看到,ticket數量已經變為-2,這顯然不合常理
這是因為ticket--不是乙個原子操作,它對應3條彙編指令
所以,thread1獲取ticket的數量時,thread3還沒有把ticket--,所以才會出現-1,-2張票。
要解決以上問題需要解決以下3點:
要實現以上要求則需要一把鎖,linux將這把鎖叫互斥量。
初始化互斥量
初始化互斥量有兩種⽅法:
pthread_mutex_t mutex = pthread_mutex_initializer
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回值:成功返回0,失敗返回錯誤號
_t *restrict attr);引數:mutex:要初始化的互斥量attr: null
銷毀互斥量
銷毀互斥量需要注意:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
互斥量加鎖和解鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回值:成功返回0,失敗返回錯誤號
呼叫
pthread_ lock
時,可能會遇到以下情況
:改進上面的售票系統**:
#include#include#include#include#includeint ticket = 100;
pthread_mutex_t mutex;
void* route(void* arg)
else
}}int main()
執行結果:
初始化
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *rest
rict attr);
引數:cond:要初始化的條件變數
attr: null
銷毀
int pthread_cond_destroy(pthread_cond_t *cond)
等待條件滿足
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mute
x);引數:
cond:要在這個條件變數上等待
mutex:互斥量
喚醒等待
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
簡單案例,首先不加條件變數:
void* rout1(void* arg)
}void* rout2(void* arg)
}int main()
執行結果:
可見,程式執行後,要麼列印大量a,要麼大量列印b。若加上條件變數,則會呈現出a、b交替列印的狀態
為什麼pthread_cond_wait需要互斥量?
Linux 多執行緒同步與互斥
在linux的多執行緒同步與互斥中,主要提供了訊號量的同步方式,以及互斥鎖和條件變數等訪問共享資源的方式。訊號量主要用於執行緒間的同步操作,兩個執行緒協同完成一件事情,在乙個執行緒完成乙個動作後,該需要通知另外乙個執行緒,進行相應的操作。1.1 需要包含的標頭檔案 include1.2 定義乙個全域...
執行緒同步與互斥
與多程序互動一樣,各個不同的執行緒之間也會存在資源的共享問題。為了解決多執行緒之間對資源訪問的同步和互斥問題,我們需要了解執行緒同步機制。第一種機制 互斥鎖 互斥鎖是一種簡單的加鎖方法,可以使單個執行緒進行對資源訪問的原子操作。互斥鎖的基本操作就是加鎖和解鎖。互斥鎖主要包含以下函式 1 初始化函式 ...
執行緒同步與互斥
1.執行緒互斥 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行...