Posix多執行緒程式設計學習筆記(五) 條件變數(2)

2021-04-25 16:36:36 字數 2934 閱讀 5155

下面的程式是經典的生產者

/消費者的例證。

#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)

一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...