多執行緒程式設計 條件變數

2021-06-12 18:10:11 字數 2661 閱讀 6589

條件變數   

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,

主要包括兩個動作:

乙個執行緒等待"條件變數的條件成立"而掛起;

另乙個執行緒使"條件成立"(給出條件成立訊號).

為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。  

1. 建立和登出

條件變數和互斥鎖一樣,都有靜態和動態兩種建立方式,

靜態方式使用pthread_cond_initializer常量,

如下:     

pthread_cond_t cond = 

pthread_cond_initializer

動態方式呼叫pthread_cond_init()函式,api定義如下:

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

儘管posix標準中為條件變數定義了屬性,但在linuxthreads中沒有實現,

因此cond_attr值通常為null,且被忽略.

登出乙個條件變數需要呼叫pthread_cond_destroy(),

只有在沒有執行緒在該條件變數上等待的時候才能登出這個條件變數,否則返回ebusy。

因為linux實現的條件變數沒有分配什麼資源,所以登出動作只包括檢查是否有等待執行緒。

api定義如下:

int pthread_cond_destroy(pthread_cond_t *cond);   

2. 等待和激發

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

int   pthread_cond_timedwait(pthread_cond_t  *cond,   

pthread_mutex_t *mutex, 

const struct timespec *abstime);   

等待條件有兩種方式:

無條件等待 pthread_cond_wait();

計時等待   

pthread_cond_timedwait();

其中計時等待方式如果在給定時刻前條件沒有滿足,則返回etimeout,結束等待.

其中abstime以與time()系統呼叫相同意義的絕對時間形式出現,0表示格林尼治時間2023年1月1日0時0分0秒。  

無論哪種等待方式,都必須和乙個互斥鎖配合,

以防止多個執行緒同時請求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的競爭條件(race condition).

mutex互斥鎖必須是普通鎖(pthread_mutex_timed_np)或者適應鎖(pthread_mutex_adaptive_np),

且在呼叫pthread_cond_wait()前必須由本執行緒加鎖(pthread_mutex_lock()),

在條件滿足從而離開pthread_cond_wait()之前,mutex將被重新加鎖,以與進入pthread_cond_wait()前的加鎖動作對應。   

激發條件有兩種形式,

pthread_cond_signal();

啟用乙個等待該條件的執行緒,存在多個等待執行緒時按入隊順序啟用其中乙個;

pthread_cond_broadcast();

啟用所有等待執行緒。  

現在來看一段典型的應用:看注釋即可。

#include

#include

#include

#include

static pthread_mutex_t mtx = pthread_mutex_initializer;

static pthread_cond_t cond = pthread_cond_initializer;

struct node 

*head = null;

static void cleanup_handler(void *arg)

static void *thread_func(void *arg)

p = head;

head = head->n_next;

printf("got %d from front of queue\n", p->n_number);

free(p);

pthread_mutex_unlock(&mtx); 

//臨界區資料操作完畢,釋放互斥鎖

}pthread_cleanup_pop(0);

return 0;

}int main(void)

printf("thread 1 wanna end the line.so cancel thread 2./n");

/** 關於pthread_cancel, 有一點額外的說明,

* 它是從外部終止子執行緒,子執行緒會在最近的取消點,退出執行緒;

* 而在我們的**裡,最近的取消點肯定就是pthread_cond_wait()了。

* 關於取消點的資訊,有興趣可以google,這裡不多說了

*/pthread_cancel(tid);

pthread_join(tid, null);

printf("all done -- exiting/n");

return 0;

}

多執行緒程式設計 條件變數

include include include include 靜態方式初始化乙個互斥鎖和乙個條件變數 static pthread mutex t mutex pthread mutex initializer static pthread cond t cond pthread cond ini...

多執行緒程式設計 條件變數

自 1 引言 條件變數是一種同步機制,允許執行緒掛起,直到共享資料上的某些條件得到滿足。條件變數上的基本操作有 觸發條件 當條件變為true 時 等待條件,掛起執行緒直到其他執行緒觸發條件。條件變數要和互斥量相聯結,以避免出現條件競爭 乙個執行緒預備等待乙個條件變數,當它在真正進入等待之前,另乙個執...

Linux多執行緒程式設計 條件變數

include int pthread cond init pthread cond t cv,const pthread condattr t cattr 返回值 函式成功返回0 任何其他返回值都表示錯誤初始化乙個條件變數。當引數cattr為空指標時,函式建立的是乙個預設的條件變數。否則條件變數的...