偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux系統(tǒng)編程—條件變量

系統(tǒng) Linux
簡(jiǎn)而言之,條件變量本身不是鎖,但它也可以造成線程阻塞,通常與互斥鎖配合使用,給多線程提供一個(gè)會(huì)合的場(chǎng)所。

條件變量是用來(lái)等待線程而不是上鎖的,條件變量通常和互斥鎖一起使用。條件變量之所以要和互斥鎖一起使用,主要是因?yàn)榛コ怄i的一個(gè)明顯的特點(diǎn)就是它只有兩種狀態(tài):鎖定和非鎖定,而條件變量可以通過(guò)允許線程阻塞和等待另一個(gè)線程發(fā)送信號(hào)來(lái)彌補(bǔ)互斥鎖的不足,所以互斥鎖和條件變量通常一起使用。

[[343985]]

當(dāng)條件滿足的時(shí)候,線程通常解鎖并等待該條件發(fā)生變化,一旦另一個(gè)線程修改了環(huán)境變量,就會(huì)通知相應(yīng)的環(huán)境變量喚醒一個(gè)或者多個(gè)被這個(gè)條件變量阻塞的線程。這些被喚醒的線程將重新上鎖,并測(cè)試條件是否滿足。一般來(lái)說(shuō)條件變量被用于線程間的同步;當(dāng)條件不滿足的時(shí)候,允許其中的一個(gè)執(zhí)行流掛起和等待。

簡(jiǎn)而言之,條件變量本身不是鎖,但它也可以造成線程阻塞,通常與互斥鎖配合使用,給多線程提供一個(gè)會(huì)合的場(chǎng)所。

條件變量的優(yōu)點(diǎn):

  • 相較于mutex而言,條件變量可以減少競(jìng)爭(zhēng)。如果僅僅是mutex,那么,不管共享資源里有沒(méi)數(shù)據(jù),生產(chǎn)者及所有消費(fèi)都全一窩蜂的去搶鎖,會(huì)造成資源的浪費(fèi)。
  • 如直接使用mutex,除了生產(chǎn)者、消費(fèi)者之間要競(jìng)爭(zhēng)互斥量以外,消費(fèi)者之間也需要競(jìng)爭(zhēng)互斥量,但如果匯聚(鏈表)中沒(méi)有數(shù)據(jù),消費(fèi)者之間競(jìng)爭(zhēng)互斥鎖是無(wú)意義的。有了條件變量機(jī)制以后,只有生產(chǎn)者完成生產(chǎn),才會(huì)引起消費(fèi)者之間的競(jìng)爭(zhēng)。提高了程序效率。

主要應(yīng)用函數(shù):

  • pthread_cond_init函數(shù)
  • pthread_cond_destroy函數(shù)
  • pthread_cond_wait函數(shù)
  • pthread_cond_timedwait函數(shù)
  • pthread_cond_signal函數(shù)
  • pthread_cond_broadcast函數(shù)

以上6 個(gè)函數(shù)的返回值都是:成功返回0, 失敗直接返回錯(cuò)誤號(hào)。

pthread_cond_t類型:用于定義條件變量,比如:pthread_cond_t cond;

##pthread_cond_init函數(shù)

函數(shù)原型:

  1. int pthread_cond_init(pthread_cond_t restrict cond, const pthread_condattr_t restrict attr); 

函數(shù)作用:初始化一個(gè)條件變量

參數(shù)說(shuō)明:

  • cond:條件變量,調(diào)用時(shí)應(yīng)傳&cond給該函數(shù)
  • attr:條件變量屬性,通常傳NULL,表示使用默認(rèn)屬性

也可以使用靜態(tài)初始化的方法,初始化條件變量:

  1. pthread_cond_t cond = PTHREAD_COND_INITIALIZER

##pthread_cond_destroy函數(shù)

函數(shù)原型:

  1. int pthread_cond_destroy(pthread_cond_t *cond); 

函數(shù)作用:銷毀一個(gè)條件變量

##pthread_cond_wait函數(shù)

函數(shù)原型:

  1. int pthread_cond_wait(pthread_cond_t restrict cond, pthread_mutex_t restrict mutex); 

函數(shù)作用:

阻塞等待一個(gè)條件變量。具體而言有以下三個(gè)作用:

  • 阻塞等待條件變量cond(參1)滿足;
  • 釋放已掌握的互斥鎖mutex(解鎖互斥量)相當(dāng)于pthread_mutex_unlock(&mutex);
  • 當(dāng)被喚醒,pthread_cond_wait函數(shù)返回時(shí),解除阻塞并重新申請(qǐng)獲取互斥鎖

其中1、2.兩步為一個(gè)原子操作。

##pthread_cond_timedwait函數(shù)

函數(shù)原型:

  1. int pthread_cond_timedwait(pthread_cond_t restrict cond, pthread_mutex_t restrict mutex, const struct timespec *restrict abstime); 

函數(shù)作用:限時(shí)等待一個(gè)條件變量

參數(shù)說(shuō)明:

前兩個(gè)比較好理解,重點(diǎn)說(shuō)明第三個(gè)參數(shù)。

這里有個(gè)struct timespec結(jié)構(gòu)體,可以在man sem_timedwait中查看。結(jié)構(gòu)體原型如下:

  1. struct timespec {  
  2. time_t tv_sec; / seconds / 秒  
  3. ​ long tv_nsec; / nanosecondes/ 納秒  

struct timespec定義的形參abstime是個(gè)絕對(duì)時(shí)間。注意,是絕對(duì)時(shí)間,不是相對(duì)時(shí)間。什么是絕對(duì)時(shí)間?2018年10月1日10:10:00,這就是一個(gè)絕對(duì)時(shí)間。什么是相對(duì)時(shí)間?給洗衣機(jī)定時(shí)30分鐘洗衣服,就是一個(gè)相對(duì)時(shí)間,也就是說(shuō)從當(dāng)時(shí)時(shí)間開(kāi)始計(jì)算30分鐘,諸如此類。

如:time(NULL)返回的就是絕對(duì)時(shí)間。而alarm(1)是相對(duì)時(shí)間,相對(duì)當(dāng)前時(shí)間定時(shí)1秒鐘。

adstime所相對(duì)的時(shí)間是相對(duì)于1970年1月1日00:00:00,也就是UNIX計(jì)時(shí)元年。

下面給出一個(gè)錯(cuò)誤用法: struct timespec t = {1, 0}; pthread_cond_timedwait (&cond, &mutex, &t); 這種用法只能定時(shí)到 1970年1月1日 00:00:01秒,想必這個(gè)時(shí)間大家都還沒(méi)出生。

正確用法: time_t cur = time(NULL); 獲取當(dāng)前時(shí)間。 struct timespec t; 定義timespec 結(jié)構(gòu)體變量t t.tv_sec = cur+1; 定時(shí)1秒 pthread_cond_timedwait (&cond, &mutex, &t); 傳參

##pthread_cond_signal函數(shù)

函數(shù)原型:

  1. int pthread_cond_signal(pthread_cond_t *cond); 

函數(shù)作用: 喚醒至少一個(gè)阻塞在條件變量上的線程

##pthread_cond_broadcast函數(shù)

函數(shù)原型:

  1. int pthread_cond_broadcast(pthread_cond_t *cond); 

函數(shù)作用: 喚醒全部阻塞在條件變量上的線程

##生產(chǎn)者消費(fèi)者條件變量模型

不管是什么語(yǔ)言,只要提到線程同步,一個(gè)典型的案例就是生產(chǎn)者消費(fèi)者模型。在Linux環(huán)境下,借助條件變量來(lái)實(shí)現(xiàn)這一模型,是比較常見(jiàn)的一種方法。

假定有兩個(gè)線程,一個(gè)模擬生產(chǎn)者行為,一個(gè)模擬消費(fèi)者行為。兩個(gè)線程同時(shí)操作一個(gè)共享資源(一般稱之為匯聚),生產(chǎn)向其中添加產(chǎn)品,消費(fèi)者從中消費(fèi)掉產(chǎn)品。

看如下示例,使用條件變量模擬生產(chǎn)者、消費(fèi)者問(wèn)題:

  1. #include <stdio.h> 
  2. #include <stdlib.h>#include <unistd.h>#include <pthread.h>typedef struct msg {    struct msg *next; 
  3.     int num;}msg_t;msg_t *head = NULL;msg_t *mp = NULL;/* 靜態(tài)初始化 一個(gè)條件變量 和 一個(gè)互斥量*/pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;void *th_producer(void *arg) 
  4. {    while (1) { 
  5.         mp = malloc(sizeof(msg_t));        mp->num = rand() % 1000;        //模擬生產(chǎn)一個(gè)產(chǎn)品 
  6.         printf("--- produce: %d --------\n", mp->num); 
  7.         pthread_mutex_lock(&mutex);        mp->next = head
  8.         head = mp;        pthread_mutex_unlock(&mutex);        pthread_cond_signal(&has_product);      //喚醒線程去消費(fèi)產(chǎn)品        sleep(rand() % 5); 
  9.     }    return NULL; 
  10. }void *th_consumer(void *arg) 
  11. {    while (1) { 
  12.         pthread_mutex_lock(&mutex);        while (head == NULL) {      //如果鏈表里沒(méi)有產(chǎn)品,就沒(méi)有搶鎖的必要,一直阻塞等待 
  13.             pthread_cond_wait(&has_product, &mutex);        }        mp = head;        head = mp->next;        //模擬消費(fèi)掉一個(gè)產(chǎn)品 
  14.         pthread_mutex_unlock(&mutex);        printf("========= consume: %d ======\n", mp->num); 
  15.         free(mp);        mp = NULL;        sleep(rand() % 5); 
  16.     }    return NULL; 
  17. }int main(){    pthread_t pid, cid;    srand(time(NULL)); 
  18.     pthread_create(&pid, NULL, th_producer, NULL);    pthread_create(&cid, NULL, th_consumer, NULL);    pthread_join(pid, NULL);    pthread_join(cid, NULL);    return 0; 

運(yùn)行結(jié)果:

 

Linux系統(tǒng)編程—條件變量

 

本文授權(quán)轉(zhuǎn)載自公眾號(hào)「良許Linux」。良許,世界500強(qiáng)外企Linux開(kāi)發(fā)工程師,公眾號(hào)里分享大量Linux干貨,歡迎關(guān)注!

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2020-10-05 22:01:02

Linux系統(tǒng)編程線程屬性

2020-10-10 07:18:14

Linux系統(tǒng)編程管道

2020-10-18 07:13:44

Linux系統(tǒng)編程信號(hào)捕捉

2020-10-05 22:05:10

Linux系統(tǒng)編程時(shí)序競(jìng)態(tài)

2020-09-25 07:34:40

Linux系統(tǒng)編程信號(hào)量

2020-09-22 07:35:06

Linux線程進(jìn)程

2020-09-26 23:09:00

Linux系統(tǒng)編程讀寫(xiě)鎖

2020-09-28 06:49:50

Linux系統(tǒng)編程互斥量mutex

2020-10-09 07:13:11

Linux系統(tǒng)編程mmap

2020-10-08 10:10:51

Linux系統(tǒng)編程信號(hào)集

2017-02-28 18:26:09

Linuxinput子系統(tǒng)編程

2010-03-05 13:34:54

2019-03-15 09:30:09

Linux系統(tǒng)CPU

2009-07-03 11:57:18

系統(tǒng)編程安全linux

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內(nèi)核

2025-04-16 04:22:00

2021-05-16 18:02:52

系統(tǒng)編程JavaScript

2024-07-05 08:32:36

2016-11-23 16:08:24

Python處理器分布式系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)