linux執行緒學習(4)

2021-08-01 06:21:50 字數 2427 閱讀 2284

1. 條件變數

提供執行緒之間的一種通知機制,當某一條件滿足時,執行緒a可以通知阻塞在條件變數上的執行緒b,b所期望的條件已經滿足,可以解除在條件變數上的阻塞操作,繼續做其他事情。

我們需要這種機制,當互斥量被鎖住以後發現當前執行緒還是無法完成自己的操作,那麼它應該釋放互斥量,讓其他執行緒工作。

1、可以採用輪詢的方式,不停的查詢你需要的條件

2、讓系統來幫你查詢條件,使用條件變數pthread_cond_t cond

2. 條件變數的初始化和銷毀

//條件變數使用之前需要初始化

pthread_cond_t cond = pthread_cond_initializer;

int pthread_cond_init(pthread_cond_t *restrict cond,

const pthread_condattr_t *restrict attr);

// 預設屬性為空null

//條件變數使用完成之後需要銷毀

int pthread_cond_destroy(pthread_cond_t *cond);

3. 條件變數的使用

//條件變數使用需要配合互斥量

int pthread_cond_wait(pthread_cond_t *restrict cond,

pthread_mutex_t *restrict mutex);

//1、使用pthread_cond_wait等待條件變為真。傳遞給pthread_cond_wait的互斥量對條件進行保護,呼叫者把鎖住的互斥量傳遞給函式。

//2、這個函式將執行緒放到等待條件的執行緒列表上,然後對互斥量進行解鎖,這是個原子操作。當條件滿足時這個函式返回,返回以後繼續對互斥量加鎖。

當條件滿足的時候,需要喚醒等待條件的執行緒

int pthread_cond_broadcast(pthread_cond_t *cond);

int pthread_cond_signal(pthread_cond_t *cond);

1、pthread_cond_broadcast喚醒等待條件的所有執行緒

2、pthread_cond_signal至少喚醒等待條件的某乙個執行緒

注意,一定要在條件改變以後在喚醒執行緒

4. 例項練習

建立兩個執行緒,乙個執行緒往buff裡寫資料,每隔1s寫一次,總共寫30次,乙個執行緒往buff裡讀資料,每隔2s讀一次,總共讀30次:

#include 

#include

#include

#include

#include

#define buff_size 5

typedef struct product

*buff_t;

void put(buff_t p,int data);

intget(buff_t p);

//進行互斥量、條件變數、位置(下標)的初始化

void init_func(buff_t p)

//函式功能:進行互斥量、條件變數的銷毀

void destory(buff_t p)

void * producer(void *arg)//子執行緒生成,然後放入buff

return null;

}void *customer(void *arg)//子執行緒消費,行buff去出相關值並列印

return null;

}void put(buff_t p,int data)

p->buff[p->writepos] = data;//buff非滿時,就可往buff裡寫入資料,

p->writepos = (p->writepos+1) % buff_size;//寫位置加一,當超過buff_size時,要從頭開始(即為零)

pthread_cond_signal(&p->notempty);//發出非空訊號,喚醒等待條件的執行緒

pthread_mutex_unlock(&p->lock);//解鎖操作

}int

get(buff_t p)

val = p->buff[p->readpos];

p->readpos=(p->readpos+1)%buff_size;

pthread_cond_signal(&p->notfull);

pthread_mutex_unlock(&p->lock);

return val;

}int main()

執行結果:

linux 多執行緒基礎4

六 執行緒的作用域 函式pthread attr setscope和pthread attr getscope分別用來設定和得到執行緒的作用域,這兩個函式的定義如下 7 名稱 pthread attr setscope pthread attr getscope 功能 獲得 設定執行緒的作用域 標頭...

linux 執行緒學習

一.執行緒建立 pthread create tid,null,fun,void arg 正常返回0.void fun void arg 二.執行緒終止 任意執行緒呼叫了exit,exit exit.那麼整個程序就會終止。單個執行緒退出 1.執行緒函式中 return或pthread exit,2....

Python多執行緒學習4 執行緒鎖lock

不使用 lock 的情況 函式一 全域性變數a的值每次加1,迴圈10次,並列印 def job1 global a for i in range 10 a 1 print job1 a 函式二 全域性變數a的值每次加10,迴圈10次,並列印 def job2 global a for i in ra...