linux執行緒操作

2022-03-19 10:48:54 字數 2931 閱讀 6154

初始化條件變數

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,否則返回錯誤的編...