亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務(wù)器 > Linux服務(wù)器 > 正文

淺談生產(chǎn)者消費(fèi)者模型(Linux系統(tǒng)下的兩種實(shí)現(xiàn)方法)

2024-09-05 23:03:28
字體:
供稿:網(wǎng)友

生產(chǎn)者消費(fèi)者問題是同步問題中的一種常見情況,借用一下維基百科的話

生產(chǎn)者消費(fèi)者問題(英語:Producer-consumer problem),也稱有限緩沖問題(英語:Bounded-buffer problem),是一個(gè)多線程同步問題的經(jīng)典案例。該問題描述了兩個(gè)共享固定大小緩沖區(qū)的線程——即所謂的“生產(chǎn)者”和“消費(fèi)者”——在實(shí)際運(yùn)行時(shí)會(huì)發(fā)生的問題。生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩沖區(qū)中,然后重復(fù)此過程。與此同時(shí),消費(fèi)者也在緩沖區(qū)消耗這些數(shù)據(jù)。該問題的關(guān)鍵就是要保證生產(chǎn)者不會(huì)在緩沖區(qū)滿時(shí)加入數(shù)據(jù),消費(fèi)者也不會(huì)在緩沖區(qū)中空時(shí)消耗數(shù)據(jù)。

第一種實(shí)現(xiàn)信號(hào)量配合互斥鎖實(shí)現(xiàn),這種方法很清晰簡單

信號(hào)量:

信號(hào)量的特性如下:信號(hào)量是一個(gè)非負(fù)整數(shù)(車位數(shù)),所有通過它的線程/進(jìn)程(車輛)都會(huì)將該整數(shù)減一(通過它當(dāng)然是為了使用資源),當(dāng)該整數(shù)值為零時(shí),所有試圖通過它的線程都將處于等待狀態(tài)。在信號(hào)量上我們定義兩種操作: Wait(等待) 和 Release(釋放)。當(dāng)一個(gè)線程調(diào)用Wait操作時(shí),它要么得到資源然后將信號(hào)量減一,要么一直等下去(指放入阻塞隊(duì)列),直到信號(hào)量大于等于一時(shí)。Release(釋放)實(shí)際上是在信號(hào)量上執(zhí)行加操作,對(duì)應(yīng)于車輛離開停車場(chǎng),該操作之所以叫做“釋放”是因?yàn)獒尫帕擞尚盘?hào)量守護(hù)的資源。

wait, release在Linux下

int sem_wait(sem_t * sem);
int sem_post(sem_t * sem);

設(shè)定兩個(gè)信號(hào)量,empty用來表示空槽的個(gè)數(shù),full用來表示占有的個(gè)數(shù)

生產(chǎn)者在向任務(wù)隊(duì)列里放資源時(shí),調(diào)用sem_wait(&full)來檢查隊(duì)列是否已滿,如果滿的話,就阻塞,直到有消費(fèi)者從里面取資源再蘇醒,如果不滿,就放資源,并通知消費(fèi)者來取。

消費(fèi)者在從任務(wù)隊(duì)列里取資源時(shí),調(diào)用sem_wait(&empty)來檢查隊(duì)列是否為空,如果空的話,就阻塞,直到有生產(chǎn)者向里面放資源再蘇醒,如果不空,就取資源,并通知生產(chǎn)者來放。

而互斥鎖僅僅是為了防止多個(gè)線程同時(shí)對(duì)隊(duì)列進(jìn)行操作,造成未知的結(jié)果。

#include <stdio.h>#include <pthread.h>#include <semaphore.h>#define MAX 5 //隊(duì)列長度pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;sem_t full; 	//填充的個(gè)數(shù)sem_t empty; 	//空槽的個(gè)數(shù)int top = 0;   //隊(duì)尾int bottom = 0; //隊(duì)頭void* produce(void* arg){	int i;	for ( i = 0; i < MAX*2; i++)	{		printf("producer is preparing data/n");		sem_wait(&empty);//若空槽個(gè)數(shù)低于0阻塞				pthread_mutex_lock(&mutex);				top = (top+1) % MAX;		printf("now top is %d/n", top);		pthread_mutex_unlock(&mutex);				sem_post(&full);	}	return (void*)1;}void* consume(void* arg){	int i;	for ( i = 0; i < MAX*2; i++)	{		printf("consumer is preparing data/n");		sem_wait(&full);//若填充個(gè)數(shù)低于0阻塞			pthread_mutex_lock(&mutex);				bottom = (bottom+1) % MAX;		printf("now bottom is %d/n", bottom);		pthread_mutex_unlock(&mutex);				sem_post(&empty);	}	return (void*)2;}int main(int argc, char *argv[]){	pthread_t thid1;	pthread_t thid2;	pthread_t thid3;	pthread_t thid4;	int ret1;	int ret2;	int ret3;	int ret4;	sem_init(&full, 0, 0);	sem_init(&empty, 0, MAX);	pthread_create(&thid1, NULL, produce, NULL);	pthread_create(&thid2, NULL, consume, NULL);	pthread_create(&thid3, NULL, produce, NULL);	pthread_create(&thid4, NULL, consume, NULL);	pthread_join(thid1, (void**)&ret1);	pthread_join(thid2, (void**)&ret2);	pthread_join(thid3, (void**)&ret3);	pthread_join(thid4, (void**)&ret4);	return 0;}

注:如果把sem_wait()和sem_post()放到pthread_mutex_lock()與pthread_mutex_unlock()之間會(huì)如何呢?

答案是:死鎖,因?yàn)槲覀儾荒茴A(yù)知線程進(jìn)入共享區(qū)順序,如果消費(fèi)者線程先對(duì)mutex加鎖,并進(jìn)入,sem_wait()發(fā)現(xiàn)隊(duì)列為空,阻塞,而生產(chǎn)者在對(duì)mutex加鎖時(shí),發(fā)現(xiàn)已上鎖也阻塞,雙方永遠(yuǎn)無法喚醒對(duì)方。

第二種是條件變量配合互斥鎖實(shí)現(xiàn)

條件變量的常見用法是在不滿足某些條件時(shí),阻塞自己,直到有線程通知自己醒來。

而互斥量在這里的作用依然還是防止多線程對(duì)共享資源同時(shí)操作,造成未知結(jié)果。

生產(chǎn)者消費(fèi)者的行為與之前相同,只不過原來只調(diào)用sem_wait()可以完成兩步,1是檢查條件,2是阻塞,現(xiàn)在條件變量需要我們自己來設(shè)定條件(所以說條件變量配合互斥鎖比信號(hào)量的功能更強(qiáng)大,因?yàn)樗梢宰远x休眠條件,但是這對(duì)使用者的要求也提高了,必須理清邏輯關(guān)系避免死鎖)

#include <stdio.h>#include <pthread.h>#define MAX 5pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t notfull = PTHREAD_COND_INITIALIZER; 	//是否隊(duì)滿pthread_cond_t notempty = PTHREAD_COND_INITIALIZER; 	//是否隊(duì)空int top = 0;int bottom = 0;void* produce(void* arg){	int i;	for ( i = 0; i < MAX*2; i++)	{		pthread_mutex_lock(&mutex);		while ((top+1)%MAX == bottom)		{			printf("full! producer is waiting/n");			pthread_cond_wait(¬full, &mutex);//等待隊(duì)不滿		}		top = (top+1) % MAX;		printf("now top is %d/n", top);		pthread_cond_signal(¬empty);//發(fā)出隊(duì)非空的消息		pthread_mutex_unlock(&mutex);	}	return (void*)1;}void* consume(void* arg){	int i;	for ( i = 0; i < MAX*2; i++)	{		pthread_mutex_lock(&mutex);		while ( top%MAX == bottom)		{			printf("empty! consumer is waiting/n");			pthread_cond_wait(¬empty, &mutex);//等待隊(duì)不空		}		bottom = (bottom+1) % MAX;		printf("now bottom is %d/n", bottom);		pthread_cond_signal(¬full);//發(fā)出隊(duì)不滿的消息		pthread_mutex_unlock(&mutex);	}	return (void*)2;}int main(int argc, char *argv[]){	pthread_t thid1;	pthread_t thid2;	pthread_t thid3;	pthread_t thid4;	int ret1;	int ret2;	int ret3;	int ret4;	pthread_create(&thid1, NULL, produce, NULL);	pthread_create(&thid2, NULL, consume, NULL);	pthread_create(&thid3, NULL, produce, NULL);	pthread_create(&thid4, NULL, consume, NULL);	pthread_join(thid1, (void**)&ret1);	pthread_join(thid2, (void**)&ret2);	pthread_join(thid3, (void**)&ret3);	pthread_join(thid4, (void**)&ret4);	return 0;}

注:

為什么信號(hào)量在互斥區(qū)外,而條件變量在互斥區(qū)內(nèi)呢?

因?yàn)榛コ怄i本質(zhì)上是二元信號(hào)量,和信號(hào)量互斥的原理相同,而且放在互斥區(qū)會(huì)死鎖,而條件變量是和互斥鎖協(xié)同配合的,

我們從pthread_cond_wait()和pthread_cond_signal()的內(nèi)部實(shí)現(xiàn)就可以看出

pthread_cond_wait()是先將互斥鎖解開,并陷入阻塞,直到pthread_signal()發(fā)出信號(hào)后pthread_cond_wait()再加上鎖,然后退出,可以看到它們?cè)谠O(shè)計(jì)時(shí)就是為了協(xié)同配合,而互斥鎖和信號(hào)量都是由Linux下的futex機(jī)制實(shí)現(xiàn)的,這里就不展開說了

這里貼出了pthread_wait()源碼圖

生產(chǎn)者消費(fèi)者模型

以上就是小編為大家?guī)淼臏\談生產(chǎn)者消費(fèi)者模型(Linux系統(tǒng)下的兩種實(shí)現(xiàn)方法)全部內(nèi)容了,希望大家多多支持VEVB武林網(wǎng)~

 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久影院免费观看| 成人在线爆射| 亚洲最新色图| 国产精品久久久久久久久久东京| 中文字幕日韩精品有码视频| 日韩一卡二卡三卡| 国产精品夫妻激情| 欧美成人性福生活免费看| 在线看片免费人成视久网| 自拍视频在线| 91麻豆制片厂| 超碰在线公开超碰在线| se69色成人网wwwsex| 国产精品久久久久久免费观看| 国产 日韩 欧美 精品| 手机看片一区二区三区| 亚洲色图50p| 久久久影视精品| 欧美日韩中文| 欧美69xxxx| 日韩欧美专区在线| 久久综合网色—综合色88| 日韩在线视频二区| 天美av一区二区三区久久| 欧美成人午夜| 91精品国产高清一区二区三密臀| 国产福利片在线观看| 97人妻精品一区二区三区| 中文在线免费观看| 中文字幕xxx| 亚洲级视频在线观看免费1级| 国产视频精品在线| 国产精品高潮呻吟久久av野狼| 久久久久久久久久久久久久av| 激情视频一区二区| 综合天堂av久久久久久久| wwwwww.欧美系列| 丁香六月久久综合狠狠色| 亚洲视频第二页| av中文字幕网址| 中文精品无码中文字幕无码专区| 大香伊人中文字幕精品| 亚洲美女av电影| 欧美激情亚洲| 日韩在线第七页| 曰本人一级毛片免费完整视频| 欧美少妇一区二区三区| 欧美日韩一区二区三区四区| 亚洲一区在线免费| 国产欧美日韩中文字幕| 日日摸夜夜夜夜夜添| 国产精品爱久久久久久久| 久久品道一品道久久精品| 99www免费人成精品| 亚洲精品国产精品乱码不99按摩| 亚洲蜜臀av乱码久久精品| 91国自产精品中文字幕亚洲| 欧美在线你懂的| 伊人久久精品视频| 日本一区精品| 欧美视频1区| 一本色道久久88亚洲综合88| av一区和二区| 欧美一级片在线| 亚洲一区二区三区免费视频| 国产综合动作在线观看| 日韩精品第一| 日本黄色不卡视频| 无码少妇一区二区三区芒果| 老司机午夜性大片| 视频在线99re| 99精品欧美一区二区三区综合在线| 欧美性猛交xxxx乱大交退制版| 国产精品一二三区在线| 在线观看免费国产成人软件| 国产日韩精品电影| 国产三级按摩推拿按摩| 91n.com在线观看| 国产欧美一区二区在线观看| 亚洲第一国产精品| 国产丝袜护土调教在线视频| 亚洲欧美综合另类在线卡通| 老司机午夜性大片| 性欧美长视频免费观看不卡| a级黄色免费视频| 久久影视电视剧免费网站清宫辞电视| 欧美精品一区二区三区一线天视频| 黄色一区二区三区四区| 欧美不卡视频一区发布| 97超碰欧美中文字幕| 91精品国产乱码久久久久久久久| 亚洲欧美在线视频观看| a视频在线看| 欧美午夜春性猛交xxxx| 人人妻人人澡人人爽精品欧美一区| 欧美视频一二区| 亚洲成人自拍网| 成人精品久久av网站| 91精品久久久久久久| 欧美片第一页| 在线观看福利电影| 污视频网址在线观看| 精品丝袜久久| 日本99精品| 中文字幕日本最新乱码视频| 国产精品一区二区男女羞羞无遮挡| 懂色av中文字幕一区二区三区| 国产高清在线精品一区二区三区| 日韩中文字幕一区二区高清99| 国产在线精彩视频| 欧美电影免费观看| 美女福利精品视频| 久久国产精品免费| 欧美日本韩国国产| 黄色的视频在线观看| 欧美中文字幕在线播放| 影音先锋国产精品| 精品国产一区二区三区久久久蜜月| 亚洲一区二区三区在线观看网站| 91人人澡人人爽人人精品| 欧美黄色免费网址| 中文字幕在线观看成人| av免费在线一区| 免费久久久久久久久| 日本福利片在线观看| 一色屋色费精品视频在线观看| 亚洲精品视频二区| 久久99国产综合精品女同| 欧美久久综合性欧美| 成人黄色大片在线观看| 亚洲精品资源在线| 93久久精品日日躁夜夜躁欧美| 国产精品久久久一区| 尤物视频一区二区| 一区二区激情小说| 秋霞一区二区| 91成人观看| 99久久激情| 色综合久久综合网欧美综合网| 性金发美女69hd大尺寸| 日本黄色中文字幕| 久久精品在线视频| 久久国产影院| yw.尤物在线精品视频| 亚洲综合中文字幕68页| 精品麻豆av| 桃花色综合影院| 亚洲bt天天射| 在线国产视频一区| 中文字幕在线观看日韩| 亚洲第一会所| 桃花网日韩影视在线观看视频| 国产suv精品一区二区三区88区| 精品国产午夜肉伦伦影院| 不卡免费追剧大全电视剧网站| 国产一线二线三线在线观看| 欧洲一区在线电影| 亚洲三级欧美| 亚洲天堂国产精品| 欧美一区激情视频在线观看| 国产有码在线一区二区视频| 日韩在线卡一卡二| 成人在线激情视频| 国偷自产一区二区免费视频| 欧美极品视频| 亚洲国产果冻传媒av在线观看| 欧美日韩亚洲综合一区二区三区激情在线| 性欧美暴力猛交69hd| 久久久久国产视频| 日韩一区二区三区久久| 免费在线观看一级毛片| 国产91丝袜在线播放九色| 欧美人与禽性xxxxx杂性| 亚洲一区二区三区成人| 国产性xxxx高清| 三年片免费观看大全| 午夜精品视频| 国产日韩精品电影| 五月天中文字幕一区二区| 国产精品伦一区二区| 羞羞视频立即看| 欧美精品激情blacked18| 欧美金发大战黑人最粗videos| 激情文学综合插| 热色播在线视频| 性欧美精品一区二区三区在线播放| 激情综合网五月婷婷| 三级av在线| 激情小说综合网| 视频一区欧美精品| eeuss影院在线观看第一页| 美女视频免费一区| 精品成人一区二区三区四区| 亚洲最新av网站| 日韩免费特黄一二三区| 精品国产乱码久久久久久牛牛| 日韩在线伦理| 日韩欧美国产综合在线| 欧美吞精做爰啪啪高潮| 日韩av在线免费播放| 欧美视频一区在线| 精品久久久久久一区二区里番| 久久永久免费视频| 91网站观看| 国产 高清 精品 在线 a| 久草成人在线| 麻豆一区二区三区在线观看| 欧美性猛交xxxx免费看| 熟妇人妻无乱码中文字幕真矢织江| 亚洲永久免费网站| 中文字幕有码无码人妻av蜜桃| 久久高清国产| 爱看av在线入口| 欧美亚洲免费| 色香阁99久久精品久久久| 亚洲深爱激情| 在线成人激情黄色| 97av中文字幕| 日本肉体xxxx裸体784大胆| 精品一区二区三区免费视频| 国内一区二区视频| 国产亚洲毛片在线| 97中文字幕| 欧美成人sm免费视频| 欧美性天天影院| 亚洲天堂av在线| 成人av一区二区三区在线观看| 久久麻豆精品| 91成人精品视频| 亚洲视频www| 日本网站在线播放| 国产精品国产精品国产专区不卡| 91精品国产免费久久综合| 超碰97人人做人人爱少妇| 国产suv精品一区二区883| 中文字幕视频在线免费观看| 91产国在线观看动作片喷水| 中文国语毛片高清视频| 日韩精品一区二区三区中文| 在线观看麻豆蜜桃| xx欧美撒尿嘘撒尿xx| 欧美美女性视频| 成人女保姆的销魂服务| 这里只有久久精品视频| 宅男深夜免费观看视频| 自拍在线播放| 巨胸喷奶水www久久久免费动漫| 亚洲 日韩 国产第一| 无码av天堂一区二区三区| av网站大全在线观看| 色999日韩自偷自拍美女| 韩日在线播放| 狠狠躁夜夜躁人人爽天天高潮| 国产1区2区3区4区| 日韩精品免费播放| 中国人体摄影一区二区三区| 国产麻豆视频一区| 亚洲 中文字幕 日韩 无码| 91亚洲国产| 久草电影在线| 日韩av在线资源| 国产又黄又粗又爽| 国产一区91精品张津瑜| av网站在线不卡| 丝袜美腿玉足3d专区一区| 国产精品美女在线观看直播| 亚洲狠狠婷婷综合久久久久图片| 日本一区二区欧美| 9999精品成人免费毛片在线看| 久草亚洲一区| 国产精品美女久久久久av爽李琼| 国语对白精品一区二区| 精品久久一区| 色在线视频免费| 日韩欧美国产成人一区二区| 美女被草91| 精品无人区麻豆乱码久久久| 一级欧美一级日韩| 欧美不卡在线视频| 精品国产一区二区三区日日嗨| 91地址最新发布| 青青草综合在线| 青娱乐极品盛宴一区二区| 少妇高潮惨叫久久久久| 91国模大尺度私拍在线视频| 性xxxx欧美老肥妇牲乱| 视频一区二区三区免费观看| 欧美一区二区高清| 亚洲精品aaa| 国产一区玩具在线观看| 日本小视频在线免费观看| 中文字幕一区二区三区欧美日韩| 很黄很黄激情成人| 国产一级特黄a大片99| 国产一区二区三区亚洲| 国产精品一区二区不卡视频| 妞干网免费在线视频| av毛片在线免费观看| 91动漫在线| 日韩av高清在线观看| 国产又黄又爽又色| 国产精品小说在线| 性视频1819p久久| 人在线成免费视频| 亚洲色图在线视频| 在线免费视频一区| 区二区三区在线| 亚洲精品影视| 福利视频在线导航| 五月婷婷亚洲综合| 91插插视频| 黄页视频在线免费观看| 国产精品视频成人| 91女厕偷拍女厕偷拍高清| 国产精品久久电影观看| 久久久午夜精品理论片中文字幕| 18激情网站| 欧美综合在线观看| 欧美成人在线网站| 在线观看国产一区二区| 日韩有码在线视频| 欧美系列一区二区| 成人av免费看| 97人妻精品一区二区三区| 先锋影音av在线资源| 国产日本韩国在线播放| 成年人免费网站| 久久免费一区|