linux執行緒筆記6

2021-07-25 20:34:00 字數 2268 閱讀 6890

互斥鎖的缺點是它只有兩種狀態:鎖定和非鎖定

條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補互斥鎖的不足。

條件變數內部是乙個等待佇列,放置等待的執行緒,執行緒在條件變數上等待和通知,互斥鎖用來保護等待佇列(對等待佇列上鎖),條件變數通常和互斥鎖一起使用

條件變數允許執行緒等待特定條件發生,當條件不滿足時,執行緒通常先進入阻塞狀態,等待條件發生變化,一旦其他的某個執行緒改變了條件,可喚醒乙個或多個阻塞的執行緒。

具體的判斷條件還需使用者給出

pthread_cond_t

#include int pthread_cond_init(pthread_cond_t *restrict cond,pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pthread_cond_t *cond);

返回值:成功返回0,失敗返回錯誤編號

引數:cond:條件變數

attr

:條件變數屬性

條件變數等待操作

#include int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

int pthread_cond_timewait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict timeout);

返回值:成功返回0,出錯返回錯誤編號

struct timesped;

引數:

cond:條件變數

mutex:互斥鎖

注意:互斥鎖mutex是對條件變數cond的保護,執行緒由於呼叫wait函式阻塞,否則釋放互斥鎖

#include int pthread_cond signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

返回值:成功返回0,出錯返回錯誤編號

引數:cond:條件變數

當條件滿足時,執行緒需要通知等待的執行緒。

pthread_cond_signal 函式通知單個執行緒

pthread_cond_broadcast函式通知所有執行緒

乙個執行緒負責計算結果,乙個執行緒負責獲取結果,計算結果的執行緒如果沒有計算完畢,獲取結果的執行緒則等待阻塞,計算結果的執行緒計算完畢在去通知(喚醒)獲取結果的執行緒

#include #include #include typedef struct

result;

//計算並將結果放置result中的執行緒執行函式

void *set_fn(void *arg)

result *r = (result *)arg;

//將計算結果放置到result的res中

r->res = sum;

pthread_mutex_lock(&r->mutex);

//判斷獲取結果的現成是否準備好

while(!r->is_wait)

pthread_mutex_unlock(&r->mutex);

//通知喚醒等待那個獲取結果的執行緒

pthread_cond_broadcast(&r->cond);

return (void *)0;

}//獲得結果的執行緒執行函式

void *get_fn(void *arg)

int main(void)

//啟動計算結果的執行緒

if((err = pthread_create(&cal,null,set_fn,(void*)&r)) != 0)

pthread_join(cal,null);

pthread_join(get,null);

pthread_cond_destroy(&r.cond);

pthread_mutex_destroy(&r.mutex);

return 0;

}

編譯:gcc  -lpthread **.c -o test

執行:./test

結果:0x1566416 get sum 5050

pthread_cond_wait()函式內部流程

pthread_cond_wait前的lock和後的unlock不是一對

Linux學習筆記(6)

12.不同系統之間的檔案傳輸 3.檔案查詢 1.locate filename 在檔案資料庫中搜尋filename資訊,updatedb更新檔案資料庫 2.find find 查詢位置 條件 條件值 exec 動作 name not 條件 user group size perm maxdepth ...

Linux學習筆記(6)

我們可以在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 n。n代表乙個數字,1 為執行指令碼的第乙個引數,2 為執行指令碼的第二個引數,以此類推 以下例項我們向指令碼傳遞三個引數,並分別輸出,其中 0為執行的檔名 bin bash author 菜鳥教程 url www.r...

《Java 執行緒程式設計》學習筆記6

thread.max priority 10 thread.min priority 1 thread.norm priority 5 何時 setpriority 失效 執行緒有如下6種狀態 執行緒規劃器控制哪乙個準備執行的執行緒實際執行於處理器上。任何時候,只有乙個執行緒實際處於執行狀態。所有其...