下面的程式是經典的生產者
/消費者的例證。
#include
#include
#include
#define max 5
pthread_mutex_t mutex=pthread_mutex_initializer;
/*初始化互斥鎖
*/ pthread_cond_t=pthread_code_initializer;
/*初始化條件變數*/
typedef structbuffer;
buffer share=;
char ch=』a』;/*
初始化ch*/
void *read_some(void *);
void *write_some(void *);
int main(void)
void *read_some(void *junk)
pthread_mutex_unlock(&lock_it);/*
解鎖互斥量
*/ }
sleep(1);
printf(「r %2d:exiting/n」,pthread_self());
return null;
}void *write_some(void *junk)
printf(「w %2d:exiting/n」,pthread_self());
return null;
}程式每讀入
5個字母,列印一遍,並清空快取區,迴圈執行直到
y為止。
程式執行結果如下:
#cc –lpthread –o readandwrite readandwrite.c
#./readandwrire
r 1082330304: stareing
w 1090718784:string
w 1090718784:waiting
r 1082330304:got char[a]
r 1082330304:got char[b]
r 1082330304:got char[c]
r 1082330304:got char[d]
r 1082330304:got char[e]
r 1082330304:signaling full
w 1090718784:wring buffer
abcde
w 1090718784:waiting
r 1082330304:got char[f]
…………………………
三、條件變數屬性
使用條件變數之前要先進行初始化。可以像我們前面那樣可靜態初始化
pthread_cond_t my_condition=pthread_cond_initializer;
也可以利用函式
pthread_cond_init
動態初始化。條件變數屬性型別為
pthread_condattr_t
,它們由以下函式初始化或摧毀。11.
名稱::pthread_condattr_init/pthread_condattr_destroy
功能:初始化/**
pthread_condattr_t
結構標頭檔案:
#include
函式原形:
int pthread_condattr_init(pthread_condattr_t *attr);
int pthread_condattr_destroy(pthread_condattr_t *attr);
引數:返回值:
若成功返回
0,若失敗返回錯誤編號。
一旦某個條件變數物件被初始化了,我們就可以利用下面函式來檢視或修改特定屬性了。
12.名稱::
pthread_condattr_getpshared/pthread_condattr_setpshared
功能:檢視或修改條件變數屬性
標頭檔案:
#include
函式原形:
int pthread_condattr_init(const pthread_condattr_t *restrict attr);
int pthread_condattr_destroy(pthread_rwlockattr_t *attr,int pshared);
引數:返回值:
若成功返回
0,若失敗返回錯誤編號。
pthread_condattr_getpshared
函式在由
valptr
指向的整數中返回這個屬性的當前值,
pthread_condattr_setpshared
則根據value
的值設定這個屬性的當前值。
value
的值可以是
pthread_process_private
或pthread_process_shared(
程序間共享).
四、條件變數與互斥鎖、訊號量的區別
到這裡,我們把
posix
的互斥鎖、訊號量、條件變數都接受完了,下面我們來比較一下他們。
1.互斥鎖必須總是由給它上鎖的執行緒解鎖,訊號量的掛出即不必由執行過它的等待操作的同一程序執行。乙個執行緒可以等待某個給定訊號燈,而另乙個執行緒可以掛出該訊號燈。
2.互斥鎖要麼鎖住,要麼被解開(二值狀態,型別二值訊號量)。
3.由於訊號量有乙個與之關聯的狀態(它的計數值),訊號量掛出操作總是被記住。然而當向乙個條件變數傳送訊號時,如果沒有執行緒等待在該條件變數上,那麼該訊號將丟失。
4.互斥鎖是為了上鎖而優化的,條件變數是為了等待而優化的,訊號燈即可用於上鎖,也可用於等待,因而可能導致更多的開銷和更高的複雜性。
Posix多執行緒程式設計學習筆記(五) 條
一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...
Posix多執行緒程式設計學習筆記(五) 條件變數(1)
一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...
Posix多執行緒程式設計學習筆記(五) 條件變數(1)
一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...