Linux程式設計三種常用執行緒同步

2021-08-20 08:43:30 字數 4185 閱讀 9832

本文介紹三種常用的執行緒同步方法,互斥量、條件變數、訊號量

共同需要的標頭檔案為#include

互斥量強調資源訪問互斥

條件變數是通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足

訊號量強調執行緒間同步

互斥量在同一時間只有乙個執行緒能訪問,任何其他試圖再次對互斥量加鎖的執行緒都會被阻塞直到當前執行緒釋放該互斥鎖。

在linux

下,執行緒的互斥量資料型別是

pthread_mutex_t

。在使用前

,要對它進行初始化。

1、初始化

靜態分配:pthread_mutex_t mutex = pthread_mutex_initializer;

動態分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);

2、加鎖

對共享資源的訪問,要對互斥量進行加鎖,如果互斥量已經上了鎖,呼叫執行緒會阻塞,直到互斥量被解鎖。

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

3、解鎖

在完成了對共享資源的訪問後,要對互斥量進行解鎖。

int pthread_mutex_unlock(pthread_mutex_t *mutex);

4、銷毀鎖

如果使用動態分配互斥量,在釋放記憶體前,需要進行銷毀以釋放資源。

int pthread_mutex_destroy(pthread_mutex *mutex);

給個例子,建立三個執行緒,用於給sum自增,並列印值,第四個執行緒條用alarm定時器,五秒後程式結束。

條件本身是由互斥量保護的,執行緒在改變條件轉態之前必須首先鎖住互斥量,條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定的條件發生。

執行緒的條件變數資料型別是

pthread_cond_t

。在使用前

,要對它進行初始化。

1、初始化條件變數

靜態態初始化,

pthread_cond_t cond = pthread_cond_initialier;

動態初始化,

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

2、等待條件成立

釋放鎖,

同時阻塞等待條件變數為真才行。

timewait()

設定等待時間,仍未

signal,

返回etimeout(

加鎖保證只有乙個執行緒

wait),呼叫wait

後必須再檢測條件

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

3、啟用條件變數

通知執行緒條件已經滿足

int pthread_cond_signal(pthread_cond_t *cond);至少能喚醒乙個等待該條件的執行緒

int pthread_cond_broadcast(pthread_cond_t *cond); 能喚醒所有等待該條件的執行緒

4、清除條件變數

無線程等待,

否則返回

ebusy

int pthread_cond_destroy(pthread_cond_t *cond);

給個例子,建立三個執行緒,第一和第二個執行緒用於sum自增,如果sum值大於50就呼叫signal函式啟用條件變數,第三個執行緒在條件不滿足時被wait阻塞起來,呼叫signal函式後,wait函式會直接獲得mutex鎖,進行下一步,給sum清0

三、訊號量(sem

訊號量是乙個特殊變數,程式對其訪問都是原子操作。

執行緒的訊號量資料型別是sem

_t。在使用前

,要對它進行初始化。

1、訊號量初始化int sem_init (sem_t *sem , int pshared, unsigned int value);

這是對由

sem指定的訊號量進行初始化,設定好它的共享選項

(linux 

只支援為

0,即表示它是當前程序的區域性訊號量

),然後給它乙個初始值

value

2、等待訊號量

給訊號量減1

,然後等待直到訊號量的值大於0。

int sem_wait(sem_t *sem);

3、釋放訊號量

訊號量值加1

。並通知其他等待執行緒。

int sem_post(sem_t *sem);

4、銷毀訊號量

我們用完訊號量後都它進行清理。歸還占有的一切資源。

int sem_destroy(sem_t *sem);

給個例子,設定兩個訊號量,建立兩個執行緒,進行對s1和s2的訊號量進行pv操作,第三個執行緒為呼叫alarm定時器,讓程式一秒後退出

三種執行緒同步方式

三種執行緒同步方式,即互斥物件 事件物件和關鍵 段。1 屬於核心物件,它能夠確保執行緒擁有對單個資源的互斥訪問權。互斥物件包含乙個使用數量,乙個執行緒id和乙個計數器。id用於標識系統中的哪個執行緒當前擁有互斥物件,計數器用於指明該執行緒擁有互斥物件的次數。2 函式 createmutex 函式原型...

Linux 執行緒同步的三種方法

執行緒的最大特點是資源的共享性,但資源共享中的同步問題是多執行緒程式設計的難點。linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖 條件變數和訊號量。通過鎖機制實現執行緒間的同步。初始化鎖。在linux下,執行緒的互斥量資料型別是pthread mutex t。在使用前,要對它進行初始化。...

Linux 執行緒同步的三種方法

執行緒的最大特點是資源的共享性,但資源共享中的同步問題是多執行緒程式設計的難點。linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖 條件變數和訊號量。通過鎖機制實現執行緒間的同步。初始化鎖。在linux下,執行緒的互斥量資料型別是pthread mutex t。在使用前,要對它進行初始化。...