初始化條件變數
int pthread_cond_init(pthread_cond_t *cv,pthread_cond_attr *cattr);函式返回值:返回0表示成功,返回其他表示失敗。
引數: pthread_cond_attr是用來設定pthread_cond_t的屬性,當傳入的值是null的時候表示使用預設的屬性。
函式返回時,建立的條件變數儲存在cv所指向的記憶體中,可以用巨集pthread_cond_initializer來初始化條件變數。值得注意的是不能使用多個執行緒初始化同乙個條件變數,當乙個執行緒要使用條件變數的時候確保它是未被使用的。
條件變數的銷毀
int pthread_cond_destroy(pthread_cond_t *cv);返回值:返回0表示成功,返回其他值表示失敗。
條件變數的使用:
int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex)int pthread_cond_signal(pthread_cond_t *cv);
使用方式如下:
pthread_mutex_lock(&mutex)while or if
(執行緒執行的條件是否成立)
pthread_cond_wait(&cond,&mutex);
執行緒執行
pthread_mutex_unlock(&mutex);
為什麼要加鎖
執行緒在執行的部分訪問的是程序的資源,有可能多個執行緒需要訪問它,為了避免由於執行緒併發執行所引起的資源競爭,所以要讓每個執行緒互斥的訪問公共資源。
使用while和if判斷執行緒執行條件釋放成立的區別。
在多執行緒資源競爭的時候,在乙個使用資源的執行緒裡面(消費者)判斷資源是否可用,不可用便呼叫pthread_cond_wait,在另乙個執行緒裡面(生產者)如果判斷資源可用的話,則會呼叫pthead_cond_signal傳送乙個資源可用的訊號。
但是在wait成功之後,資源就不一定可以被使用,因為同時有兩個或兩個以上的執行緒正在等待次資源,wait返回後,資源可能已經被使用了,在這種情況下
while(resource ==false)pthread_cond_wait(&cond,&mutex);
如果之後只有乙個消費者,就可使用if。
分解pthread_cond_wait動作為以下步驟:
執行緒放在等待佇列上,解鎖
等待pthread_cond_signal或者pthread_cond_broadcast訊號之後去競爭鎖
若競爭到互斥鎖則加鎖
有可能多個執行緒在等待這個資源可用的訊號,訊號發出去之後只有乙個資源可用,但是有a,b兩個執行緒在等待,b速度比較快,獲得互斥鎖,然後加鎖,消耗資源,然後解鎖,之後a獲得互斥鎖,但它回去發現資源已經被使用了,它便有兩個選擇,乙個失去訪問不存在的資源,另乙個就是繼續等待,那麼等待下去的條件就是使用while,要不然使用if的話pthread_cond_wait返回後,就會順序執行下去。
等待執行緒:
pthread_cond_wait 前要加鎖
pthread_cond_wait 內部會解鎖,然後等待條件變數被其他執行緒啟用
pthread_cond_wait 被啟用後會再自動加鎖
啟用執行緒
加鎖(和等待執行緒用同乙個鎖)
pthread_cond_signal 傳送訊號(階躍訊號前最後判斷有無等待執行緒)
解鎖啟用執行緒的上面三個操作再執行時間上都是再等待執行緒的pthread_cond_wait函式內部。
/***pthread_if.c
***/
#include
#include
#include
#include
#include
pthread_mutex_t mutex =pthread_mutex_initializer;
pthread_cond_t cond =pthread_cond_initializer;
int count = 0
;void *decrement(void *arg)
void *increment(void *arg)
printf(
"out increment\n");
pthread_mutex_unlock(&mutex);
return
null;
}int
main()
/***pthread_while.c
***/
#include
#include
#include
#include
typedef
struct
node_s
node_t;
node_t *head =null;
pthread_mutex_t mutex =pthread_mutex_initializer;
pthread_cond_t cond =pthread_cond_initializer;
void cleanup_handler(void *arg)
void *thread_func(void *arg)
pthread_cleanup_pop(0);
return
null;
}int
main()
pthread_cancel(tid);
pthread_join(tid,null);
return0;
}
linux 檔案程式設計操作 執行緒操作
專案名稱 蘇嵌實訓 嵌入式 linux c 第 7 天 今日進度 以及任務 1.嵌入式linuxc程式設計 2.檔案程式設計 3.多工程式設計 執行緒 本日任務完成情況 本日開發 現的問題彙總 本日未解決問題 本日開發收穫 了解了嵌入式為什麼要移植作業系統,creat open read write...
Linux下執行緒的操作
01 7 27 上午 10 39 13 介紹在linux下執行緒的建立和基本的使用。linux下的執行緒是乙個非常複雜的問題,由於我對執行緒的學習不時很好,我在這裡只是簡單的介紹執行緒的建立和基本的使用,關於執行緒的高階使用 如執行緒的屬性,執行緒的互斥,執行緒的同步等等問題 可以參考我後面給出的資...
Linux 執行緒操作函式總結
1 執行緒建立函式int pthread create pthread t restrict tidp,const pthread attr t restrict attr,void start rtn void void restrict arg 返回值 若是成功建立執行緒返回0,否則返回錯誤的編...