Linux 執行緒同步與互斥

2021-08-19 22:41:10 字數 2968 閱讀 3687

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

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