互斥鎖用於保護臨界區,使得任何時刻只有乙個執行緒在執行其中的**。確切的說,互斥鎖用於保護多個執行緒或多個程序分享的共享資料。
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...
互斥鎖與條件變數
條件改變這兩個操作之間存在乙個時間視窗。這裡存在著競爭。我們知道互斥量是可以用來解決上面的競爭問題的,所以條件變數本身 是由互斥量來保護的。既然判斷和睡眠是由互斥量來保護從而成為乙個原子操作,那麼其他改變條件的執行緒就應該以一致的方式修改條件 也就是說其他執行緒在改變條件狀態前也必須首先鎖住互斥量。...