多執行緒的條件變數

2021-06-07 06:55:54 字數 2082 閱讀 6753

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待"條件變數的條件成立"而掛起;另乙個執行緒使"條件成立"(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。

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_signal()啟用乙個等待該條件的執行緒,存在多個等待執行緒時按入隊順序啟用其中乙個;而pthread_cond_broadcast()則啟用所有等待執行緒。

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

#include

#include

static pthread_mutex_t mtx = pthread_mutex_initializer;

static pthread_cond_t cond = pthread_cond_initializer;

struct node *head = null; /*[thread_func]*/

static void cleanup_handler(void *arg)

static void *thread_func(void *arg)

pthread_cleanup_pop(0);

return 0; /*ec_cleanup_bgn (void)pthread_mutex_unlock(&mtx); ec_flush("thread_func") return 1; ec_cleanup_end*/ } /**/

intmain(void)

printf("thread 1 wanna end the cancel thread 2.\n");

pthread_cancel(tid); //關於pthread_cancel,有一點額外的說明,它是從外部終止子執行緒,子執行緒會在最近的取消點,退出執行緒,而在我們的**裡,最近的取消點肯定就是pthread_cond_wait()了。關於取消點的資訊,有興趣可以google,這裡不多說了

pthread_join

(tid, null);

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

return 0; /**/ /*ec_cleanup_bgn return exit_failure; ec_cleanup_end*/

}

條件變數 多執行緒

最近看 unix環境高階程式設計 多執行緒同步,看到他舉例說條件變數pthread cond t怎麼用,愣是沒有看懂,只好在網上找了份 跑了跑,才弄明白 cpp view plain copy include include include pthread mutex t mutex pthread...

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

條件變數 條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。1.建立和登出 條件變數和互斥鎖一樣,都有靜態和動態兩種建立方式,靜態...

APUE多執行緒 條件變數

關於條件變數相關的定義和函式參考下面第一篇部落格,比較直觀的程式例子參看第二篇部落格.二位老人家寫的不錯,我這裡只是捋一下apue書中關於條件變數的 include struct msg struct msg workg pthread cont t qready pthread cond init...