色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳談Linux操作系統(tǒng)編程的條件變量

如意 ? 來(lái)源:良許Linux ? 作者:良許 ? 2020-09-27 15:23 ? 次閱讀

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

當(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ù)原型:

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)初始化的方法,初始化條件變量:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

##pthread_cond_destroy函數(shù)

函數(shù)原型:

int pthread_cond_destroy(pthread_cond_t *cond);

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

##pthread_cond_wait函數(shù)

函數(shù)原型:

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ù)原型:

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)體原型如下:

struct timespec { time_t tv_sec; / seconds / 秒 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ù)原型:

int pthread_cond_signal(pthread_cond_t *cond);

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

##pthread_cond_broadcast函數(shù)

函數(shù)原型:

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)題:

#include 《stdio.h》 #include 《stdlib.h》#include 《unistd.h》#include 《pthread.h》typedef struct msg { struct msg *next; 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) { while (1) { mp = malloc(sizeof(msg_t)); mp-》num = rand() % 1000; //模擬生產(chǎn)一個(gè)產(chǎn)品 printf(“--- produce: %d --------\n”, mp-》num); pthread_mutex_lock(&mutex); mp-》next = head; head = mp; pthread_mutex_unlock(&mutex); pthread_cond_signal(&has_product); //喚醒線程去消費(fèi)產(chǎn)品 sleep(rand() % 5); } return NULL; }void *th_consumer(void *arg) { while (1) { pthread_mutex_lock(&mutex); while (head == NULL) { //如果鏈表里沒(méi)有產(chǎn)品,就沒(méi)有搶鎖的必要,一直阻塞等待 pthread_cond_wait(&has_product, &mutex); } mp = head; head = mp-》next; //模擬消費(fèi)掉一個(gè)產(chǎn)品 pthread_mutex_unlock(&mutex); printf(“========= consume: %d ======\n”, mp-》num); free(mp); mp = NULL; sleep(rand() % 5); } return NULL; }int main(){ pthread_t pid, cid; srand(time(NULL)); 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)編程的條件變量


責(zé)編AJX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209332
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28360
  • 操作環(huán)境
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    7053
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux系統(tǒng)編程

    Linux系統(tǒng)編程
    發(fā)表于 03-03 10:26

    Linux操作系統(tǒng)安裝與使用

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)一、Linux操作系統(tǒng)安裝與使用(命令)二、Linux開(kāi)發(fā)工
    發(fā)表于 11-05 08:25

    為何將Linux操作系統(tǒng)劃分為用戶和內(nèi)核

    linux_C網(wǎng)絡(luò)編程概述嵌入式網(wǎng)絡(luò)編程==嵌入式Linux_C系統(tǒng)編程(文件、進(jìn)程、進(jìn)程間通信、多線程、網(wǎng)絡(luò)、大并發(fā)網(wǎng)絡(luò)服務(wù)器、數(shù)據(jù)庫(kù)、s
    發(fā)表于 12-15 08:35

    Linux操作系統(tǒng)安裝與使用

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)Linux操作系統(tǒng)安裝與使用(命令)Linux開(kāi)發(fā)工具(gc
    發(fā)表于 12-22 07:47

    嵌入式Linux C系統(tǒng)編程相關(guān)資料下載

    D3.31、嵌入式網(wǎng)絡(luò)編程==嵌入式Linux C系統(tǒng)編程(文件、進(jìn)程、進(jìn)程間通信、多線程、網(wǎng)絡(luò)、大并發(fā)網(wǎng)絡(luò)服務(wù)器、數(shù)據(jù)庫(kù)、shell編程)2、嵌入式C開(kāi)發(fā)VS嵌入式
    發(fā)表于 12-22 07:44

    Linux操作系統(tǒng)安裝與使用方法

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)Linux操作系統(tǒng)安裝與使用(命令)Linux開(kāi)發(fā)工具(gc
    發(fā)表于 12-23 06:57

    什么是Linux系統(tǒng)編程

    什么是Linux系統(tǒng)編程Linux系統(tǒng)編程也叫Linux下的高級(jí)編程,是介于應(yīng)用層和驅(qū)動(dòng)層之間
    發(fā)表于 12-23 07:30

    是否可以為linux操作系統(tǒng)編譯并在基于debian的rasperry操作系統(tǒng)中運(yùn)行?

    STM32CubeProgrammer 有一個(gè) C++ API,允許創(chuàng)建使用 qt creator 編譯的程序。是否可以為 linux 操作系統(tǒng)編譯并在基于 debian 的 rasperry 操作系統(tǒng)中運(yùn)行?
    發(fā)表于 12-06 06:01

    Linux操作系統(tǒng)

    linux的教學(xué)內(nèi)容1 、Linux概述 2 、Linux操作系統(tǒng)安裝3、 Linux的內(nèi)核 4 、Li
    發(fā)表于 04-10 16:54 ?0次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)</b>

    基于Linux操作系統(tǒng)下C語(yǔ)言編程入門

    基于Linux操作系統(tǒng)下C語(yǔ)言編程入門
    發(fā)表于 10-27 15:36 ?11次下載
    基于<b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)</b>下C語(yǔ)言<b class='flag-5'>編程</b>入門

    linux系統(tǒng)編程_中文版

    linux系統(tǒng)編程_中文版
    發(fā)表于 10-29 10:17 ?0次下載
    <b class='flag-5'>linux</b><b class='flag-5'>系統(tǒng)編程</b>_中文版

    Linux操作系統(tǒng)下C語(yǔ)言編程入門.pdf

    Linux操作系統(tǒng)下C語(yǔ)言編程入門
    發(fā)表于 05-17 10:08 ?96次下載

    詳談Linux操作系統(tǒng)編程的互斥量mutex

    前文提到,系統(tǒng)中如果存在資源共享,線程間存在競(jìng)爭(zhēng),并且沒(méi)有合理的同步機(jī)制的話,會(huì)出現(xiàn)數(shù)據(jù)混亂的現(xiàn)象。為了實(shí)現(xiàn)同步機(jī)制,Linux中提供了多種方式,其中一種方式為互斥鎖mutex(也稱之為互斥量)。
    的頭像 發(fā)表于 09-28 15:09 ?2497次閱讀
    <b class='flag-5'>詳談</b><b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)編程</b>的互斥量mutex

    為什么我們要掌握Linux系統(tǒng)編程

    為什么我們要掌握Linux系統(tǒng)編程
    的頭像 發(fā)表于 05-17 10:00 ?866次閱讀

    Linux 系統(tǒng)編程的難點(diǎn)是什么

    對(duì)于有一定 Linux 開(kāi)發(fā)基礎(chǔ)希望進(jìn)階學(xué)習(xí) Linux 系統(tǒng)編程的開(kāi)發(fā)人員來(lái)說(shuō),其難點(diǎn)在于,Linux 所囊括的技術(shù)點(diǎn)繁雜,往往不知從何下手。
    發(fā)表于 06-28 12:54 ?635次閱讀
    主站蜘蛛池模板: 2018三级网站免费观看| 古装性艳史电影在线看| 果冻传媒APP免费网站在线观看| 欧美特黄99久久毛片免费| 越南女子杂交内射BBWXZ| 国产手机在线精品| 偷拍久久国产视频免费| 成视频高清| 青青草原在线新免费| ca88亚洲城娱乐| 欧美人与禽ZOZO性伦交视频| 综合久久伊人| 老师好爽你下面水好多视频| 又硬又粗又大一区二区三区视频| 黑粗硬大欧美在线视频| 亚洲乱码国产乱码精品精98| 国产精品久久久精品日日| 无码人妻少妇色欲AV一区二区| 国产精品久久自在自2021| 无码AV精品久久一区二区免费| 国产美女久久久久久久久久久| 亚洲AV 无码AV 中文字幕| 韩国精品韩国专区久久| 亚洲视频免费| 美女图片131亚洲午夜| 2018久久视频在线视频观看| 欧美极品尿交| 国产精品99久久久精品无码| 性女传奇快播| 久久久国产精品免费A片蜜芽广| 中文字幕无码一区二区免费| 女人高潮时一吸一夹 | 拔萝卜视频免费看高清| 色 花 堂 永久 网站| 花蝴蝶免费版高清版| 中文字幕一区二区三区在线不卡| 男人就爱吃这套下载| 囯产精品久久久久免费蜜桃| 亚洲国产精品高清在线| 两百磅美女| 国产69精品久久久久人妻刘玥|