1. 程式人生 > >【經典面試題】生產者消費者模型

【經典面試題】生產者消費者模型

條件變數

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制。主要包括兩個動作:一個執行緒等待“條件變數的條件成立”而掛起,另一個執行緒讓“條件成立(給出條件成立訊號)”

作用:為了防止競爭

注意事項:條件變數的使用總是和一個互斥鎖結合在一起

1.pthread_cond_t cond;    //定義條件變數的全域性變數

2.pthread_cond_init(&cond,NULL)  //初始化

3.pthread_cond_wait(&cond,&mutex) //等待條件  mutex為互斥量   阻塞時將mutex置成1,返回時,將mutex恢復程原樣

4.pthread_cond_signal(&cond)//傳送訊號讓等待條件滿足

5.pthread_cond_destroy(&cond)//銷燬條件變數

案例:一秒鐘列印一次啟用

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 pthread_cond_t cond;
  5 pthread_mutex_t mutex;
  6 void *r1(void *arg)                                                                                                                                      
  7 {
  8     while(1)
  9     {
 10         pthread_cond_wait(&cond,&mutex);
 11         printf("啟用!!\n");
 12     }
 13 }
 14 void *r2(void *arg)
 15 {
 16     while(1)
 17     {
 18         sleep(1);
 19         pthread_cond_signal(&cond);
 20     }
 21 }
 22 int main()
 23 {
 24     pthread_t t1,t2;
 25     pthread_cond_init(&cond,NULL);
 26     pthread_mutex_init(&mutex,NULL);
 27     pthread_create(&t1,NULL,r1,NULL);
 28     pthread_create(&t2,NULL,r2,NULL);
 29     pthread_join(t1,NULL);
 30     pthread_join(t2,NULL);
 31     pthread_cond_destroy(&cond);
 32     pthread_mutex_destroy(&mutex);
 33 }

生產者消費者模型

生產者生產物品消費者必須要等生產者的物品生產後才能進行消費,當出現多個生產者多個消費者的時候就需要用互斥鎖來進行控制,避免產生混亂,具體如圖:

具體使用:

wait使用規範:

pthread_mutex_lock(&mutex) //在鎖的環境內使用

while(條件不滿足)  //用while的原因:wait可以被pthread_cond_signal喚醒也可以被訊號喚醒

          pthread_cond_wait(&cond,&mutex)

pthread_mutex_unlock(&mutex)

消費者:

pthread_mutex_lock(&mutex)

pthread_cond_signal(&cond)//有執行緒在wait就通知執行緒返回,沒有執行緒在等待,signal訊號被丟掉

pthread_mutex_unlock(&mutex)

具體程式碼:

  1 #include<stdio.h>                                                                                                                                                                                            
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 #include<unistd.h>
  5 #define CONSUMERS_COUNT 2  //定義兩個生產者
  6 #define PRODUCERS_COUNT 2  //定義兩個消費者
  7 int counter=0;//倉庫中產品的個數
  8 pthread_cond_t cond;
  9 pthread_mutex_t mutex;
 10 void *consumer(void *arg)
 11 {
 12     int id=*(int*)arg;
 13     free(arg);
 14     while(1)
 15     {
 16         pthread_mutex_lock(&mutex);
 17         while(counter<=0)
 18         {
 19             printf("%d 消費者執行緒等待消費\n",id);
 20             pthread_cond_wait(&cond,&mutex);
 21         }
 22         printf("%d消費者執行緒開始消費\n",id);
 23         counter--;
 24         sleep(rand()%5);//隨機設定一個消費時間
 25         printf("%d消費者執行緒結束消費\n",id);
 26         pthread_mutex_unlock(&mutex);
 27         sleep(rand()%2);
 28     }
 29 }
 30 void *producer(void *arg)
 31 {
 32     int id=*(int*)arg;
 33     free(arg);
 34     while(1)
 35     {
 36         pthread_mutex_lock(&mutex);
 37         printf("%d生產者執行緒開始生產\n",id);
 38         counter++;
 39         sleep(rand()%6);
 40         printf("%d生產者執行緒生產產品結束\n",id);
 41         pthread_cond_signal(&cond);
 42         pthread_mutex_unlock(&mutex);
 43         sleep(1);
 44     }
 45 }
 46 int main()
 47 {
 48     srand(getpid());
 49     pthread_t tid[CONSUMERS_COUNT+PRODUCERS_COUNT];
 50     pthread_cond_init(&cond,NULL);
 51     pthread_mutex_init(&mutex,NULL);
 52     int i;
 53     for( i=0;i<CONSUMERS_COUNT;i++)
 54     {
 55         int *p=malloc(sizeof(int));
 56         *p=i;//將獲取到的執行緒號儲存
 57         pthread_create(&tid[i],NULL,consumer,p);
 58     }
 59     for( i=0;i<PRODUCERS_COUNT;i++)
 60     {
 61         int *p=malloc(sizeof(int));
 62         *p=i;
 63         pthread_create(&tid[i+CONSUMERS_COUNT],NULL,producer,p);
 64     }
 65     for( i=0;i<CONSUMERS_COUNT+PRODUCERS_COUNT;i++)
 66     {
 67         pthread_join(tid[i],NULL);//執行緒等待
 68     }
 69     pthread_cond_destroy(&cond);
 70     pthread_mutex_destroy(&mutex);
 71 }                                  

相關推薦

經典試題生產者消費者模型

條件變數 條件變數是利用執行緒間共享的全域性變數進行同步的一種機制。主要包括兩個動作:一個執行緒等待“條件變數的條件成立”而掛起,另一個執行緒讓“條件成立(給出條件成立訊號)” 作用:為了防止競爭 注意事項:條件變數的使用總是和一個互斥鎖結合在一起 1.pthread

python隊列生產者消費者模型

生產者消費者模式生產者消費者模型:在軟件開發的過程中,經常碰到這樣的場景:某些模塊負責生產數據,這些數據由其他模塊來負責處理(此處的模塊可能是:函數、線程、進程等)。產生數據的模塊稱為生產者,而處理數據的模塊稱為消費者。在生產者與消費者之間的緩沖區稱之為倉庫。生產者負責往倉庫運輸商品,而消費者負責從倉庫裏取出

求和為n的連續正整數經典試題

題目描述:給一個正整數n,打印出所有的和為n的連續正整數序列,如果不存在則輸出空,如:n=15,因為15=1+2+3+4+5=4+5+6=7+8則輸出[1,2,3,4,5],[4,5,6],[7,8] 本文用javascript來實現的,程式碼都一樣。

經典試題JavaScript陣列去重

題目 已知有如下一個陣列,要求實現一個去重方法: var arr = ['aa', 'bb', 'cc', '', 1, 0, '1', 1, 'bb', null, undefined, null]; 既然是面試題,肯定要考慮相容性和效率。 幾種實現 第一種實

react試題不可錯過的react 試題

下面是一個常用的關於 React 的面試問題列表: 無論作為一個面試者,或者招聘官,下面這些問題都可以去參考 React 的工作原理 React 會建立一個虛擬 DOM(virtual DOM)。當一個元件中的狀態改變時,React 首先會通過 "diffing" 演算法來

vuejs試題務必熟知的vuejs試題

  vuejs 基礎必備 1、active-class 是哪個元件的屬性?巢狀路由怎麼定義   (1)、active-class 是 vue-router 模組的 router-link 元件的屬性   (2)、使用 children 定義巢狀路由 2、怎麼定義 vu

vuejs試題務必熟知的vuejs試題「務必收藏」

com 模式 問題 get vpd 插入圖片 文件中 出發 的確 如果能幫到你,點個贊吧,務必熟知的vuejs面試題「務必收藏」 vuejs 基礎必備 1、active-class 是哪個組件的屬性?嵌套路由怎麽定義   (1)、active-class 是 vue-rou

Java試題之類載入:從試題分析Java類載入機制

 “載入”(Loading)階段是“類載入”(Class Loading)過程的第一個階段,在此階段,虛擬機器需要完成以下三件事情:        1、 通過一個類的全限定名來獲取定義此類的二進位制位元組流。        2、 將這個位元組流所代表的靜態儲存結構轉化為方法區的執行時資料結

Java試題spring+springMVC+mybatis原理及實現機制(持續更新)

本文將持續更新,主要講解SSM框架的底層原理和實現機制等 1.什麼是IOC? IOC即Inverse of Control,它包括兩個內容:控制與反轉 那到底什麼東西的“控制”被“反轉”了呢?對於軟體而言,即是某一個介面具體實現類的選擇控制權從呼叫類中移除,轉交給第三

java試題Static Nested Class(巢狀類) 和 Inner Class(內部類)的不同 、final、static

前言: 本來是想總結一下inner class 的用法,但是卻發現這幾位頗為親近。索性一起拉出來溜溜。 寫作目的: 跟 static , final, inner class 搞好關係,以便將來遇見了,就像用if ,else一樣,一清二楚。 文中的術語定義以java language spec為準。 先想想

Java試題11 什麼是內部類?Static Nested Class 和 Inner Class的不同。

Inner Class(內部類)定義在類中的類。 (一般是JAVA的說法) Nested Class(巢狀類)是靜態(static)內部類。(一般是C++的說法) 靜態內部類:1 建立一個static內部類的物件,不需要一個外部類物件2 不能從一個static內部類的一

Anonymous Inner Class(匿名內部類)是否可以繼承其它類?是否可以實現介面?Java試題

回答:匿名內部類在實現時必須藉助一個藉口或者一個抽象類或者一個普通類來構造,從這過層次上講匿名內部類是實現了介面或者繼承了類,但是不能通過extends或implement關鍵詞來繼承類或實現介面。

一道試題一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?

這個面試題的答案在網上一搜一大把 但都是兩句話就結束了,我們來仔細看一下具體是什麼情況! 首先 肯定的一點是一個.java的原始檔中是可以包含多個類的,但是public類只能有一個,並且類名要和檔名相同,如果有兩個public類 就會報出以下的錯誤 這

Java試題之分頁功能的實現

以下內容是根據網上內容以及傳智播客教學整理而來,侵刪。 分頁的實現可分為兩大類:一、資料在Java程式碼中進行分頁,然後取得當前頁資料;二、在資料庫中直接取得當前頁資料。通常面試官都希望聽到後者,因為那才是高效的方法。你如果想讓面試官覺得你的能力高的話你就先否定他的問

每日試題給定一個字串,求出其最長的重複子串

題目:給定一個字串,求出其最長的重複子串 如字串abcdabcabcd,求的最長重複子串為abcd 程式碼: void LongChar(char* str) {  if(str==NULL)   return;  int max=0;  int first=0;  int

抽象類(abstract class)和介面(interface)有什麼異同?Java試題

1、抽象類可以包含非抽象的方法,而介面中的方法必須是抽象的。 2、繼承抽象類在Java語言體系中體現一種繼承關係,在合理的繼承關係中,父類和派生類比如按存在is-a關係。而實現介面則體現一種has-a

奇葩試題因為太難而被禁用的17道Google試題

即使是最成功的公司,它的招聘過程有時也會很不靠譜,經常會出一些奇怪的看似沒有答案的面試問題,但標準答案卻讓應聘者還沒來得及接近「起跑線」就被「退賽」了。Google 曾經就是這樣的公司,招聘人員會出一些難為應聘者的高質量問題。事實上,有些問題實在是太古怪了,最終被完全禁用。2

Java試題如何回答GC相關問題

一個面試官對面試問題的分析 這個帖子的背景是今晚看到je上這張貼:大家都來說說自己最討厭的面試題目吧。,心血來潮寫下的文字,如果能拋磚引玉,能有其他面試官分析一下自己面試時問的問題,那或許是件很有意義的事情。 在公司當技術面試官幾年間,從應屆生到工作十幾年的應聘者都遇到過。先表達一下我自己對面試的觀點:

Java試題一次完整的Http請求過程(非常詳細)

④ 如果在hosts檔案中也沒有找到對應的條目,瀏覽器就會發起一個DNS的系統呼叫,就會向本地配置的首選DNS伺服器(本地DNS伺服器,一般是電信運營商提供的,也可以使用像Google提供的DNS伺服器)發起域名解析請求(遞迴,通過的是UDP協議向DNS的53埠發起請求,這個請求是遞迴的請求,也就是運營商的D

演算法試題從1-200中任意選出101個自然數,其中一個數必是另一個數的整數倍

【愛奇藝】現有1-200之間的正整數,假設從中任意抽取101個數,試證明其中必然有一個數可以被另外一個數整除? 證明: 任意整數都可以寫成(2^a)*b的形式,其中a>=0,b為奇數. 把這200個數分類如下: 以上共分為100類,即100個抽屜。顯然在同