互斥鎖與條件變數

2021-08-19 01:58:47 字數 2189 閱讀 3224

互斥鎖用於保護臨界區,使得任何時刻只有乙個執行緒在執行其中的**。確切的說,互斥鎖用於保護多個執行緒或多個程序分享的共享資料。

posix互斥鎖被宣告為具有pthread_mutex_t資料型別的變數。

若互斥鎖變數是靜態分配的,則初始化為:

static pthread_mutex_t lock = pthread_mutex_initializer;

若互斥鎖變數是動態分配的(malloc),或者分配在共享記憶體區中,那麼我們必須在執行之時進行初始化:

int pthread_mutex_init(pthread_mutex_t *mptr,const pthread_mutexattr_t *attr);

互斥鎖建立與銷毀

int pthread_mutex_init(pthread_mutex_t *mptr, const pthread_mutexattr_t *attr);//mptr為互斥鎖變數,attr指定其屬性

int pthread_mutex_destory(pthread_mutex_t *mptr);

互斥鎖上鎖與解鎖

#include int pthread_mutex_lock(pthread_mutex_t *mptr);//嘗試上鎖時,該鎖已經被鎖,則阻塞等待。

int pthread_mutex_trylock(pthread_mutex_t *mptr);//嘗試上鎖時,該鎖已經被鎖,則返回busy錯誤。

int pthread_mutex_unlock(pthread_mutex_t *mptr);

互斥鎖用於上鎖(競爭),條件變數用於等待(同步)。條件變數的型別是pthread_cond_t的變數。

條件變數需要互斥鎖配合的原因每個條件變數總是有乙個互斥鎖與之關聯,呼叫wait函式前必須用lock加鎖,防止多個執行緒同時請求wait。(保護wait)

條件變數的休眠與喚醒

int pthread_cond_init(pthread_cond_t *cptr, const pthread_condattr_t *attr);//cptr為條件變數,attr指定其屬性

int pthread_cond_destory(pthread_cond_t *cptr);

條件變數的休眠與喚醒

#include int pthread_cond_wait(pthread_cond_t *cptr,pthread_cond_t *mptr);//cptr為條件變數位址;mptr為互斥量位址。

int pthread_cond_signal(pthread_cond_t *cptr);//signal 函式用來喚醒 wait 函式。

條件變數靜態初始化:

static pthread_cond_t cond = pthread_cond_initializer;

生產者消費者使用鎖與條件變數例子

int nitems;

int buff[1000];

struct put = ;

structnready = ;//對鎖與條件變數進行初始化

void *produce(void *arg)

buff[put.nput] = put.nval;

put.nput++;

put.nval++;

pthread_mutex_unlock(&put.mutex);

pthread_mutex_lock(&nready.mutex);

if(nready.nready == 0)

pthread_cond_signal(&nready.cond);

nready.nready++;

pthread_mutex_unlock(&nready.mutex);

*((int *)arg) += 1; }}

void *consume(void *arg)

pthread_cond_timewait允許執行緒就阻塞時間設定乙個限制值,該限制值指定這個函式必須返回時的系統時間(絕對時間),即便相應的條件變數還沒有收到訊號。若發生超時情況,函式返回etimedout錯誤。

互斥鎖與條件變數

最近複習湯小丹的 計算機作業系統 西安電子科技大學出版社,第三版 程序 執行緒同步章節時,發現乙個疑問。在講程序同步時,提到了兩類方法 訊號量機制和管程機制。訊號量機制又包括四種 整型訊號量 記錄型訊號量 and型訊號量 訊號量集。如果採用整型訊號量或記錄型訊號量,則在共享多個資源時,可能出現程序死...

互斥鎖與條件變數

pthread cond wait總和乙個互斥鎖結合使用。在呼叫pthread cond wait前要先獲取鎖。pthread cond wait函式執行時先自動釋放指定的鎖,然後等待條件變數的變化。在函式呼叫返回之前,自動將指定的互斥量重新鎖住。int pthread cond signal pt...

互斥鎖與條件變數

條件改變這兩個操作之間存在乙個時間視窗。這裡存在著競爭。我們知道互斥量是可以用來解決上面的競爭問題的,所以條件變數本身 是由互斥量來保護的。既然判斷和睡眠是由互斥量來保護從而成為乙個原子操作,那麼其他改變條件的執行緒就應該以一致的方式修改條件 也就是說其他執行緒在改變條件狀態前也必須首先鎖住互斥量。...