1. 程式人生 > >生產者與消費者模型(基於單鏈表、環形佇列、多執行緒、多消費多生產)

生產者與消費者模型(基於單鏈表、環形佇列、多執行緒、多消費多生產)

#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <semaphore.h>
#define SIZE 10
sem_t product_sem;
sem_t consumer_sem;
static int pro=SIZE;
static int con=0;
static int p=0;
static int c=0;
static int d=0;
static int table[SIZE];
void* product_fun(void* val)
{
    int i=1;
    int index=0;
    while(i)
    {
        sem_wait(&product_sem)
        table[p]=i;
        pro--;
        con++;
        printf("which product:%u\n",pthread_self);
        printf("product#  product success,total:%d\n",i++);
        printf("product#  you have %d blank source!\n",pro);
        printf("product#  you have %d data source!\n",con);
        for(index=0;index<SIZE;index++)
        {
            if(table[index]!=0)
                printf("array[%d]:%d ",index,table[index]);
        }
        printf("\n");
        
        sem_post(&consumer_sem);
        p=(p+1)%SIZE;
        sleep(1);
    }
    return NULL;
}
void* consumer_fun(void* val)
{
    int i=1;
    int temp=0;
    while(i)
    {
        sem_wait(&consumer_sem);
        if(c!=0)
            d=c-1;
        temp=table[c];
        table[c]=0;
        pro++;
        con--;
        printf("which consumer:%u\n",pthread_self());
        printf("consume: %d\n",temp);
        printf("consumer#  you have %d data source!\n",con);
        printf("consumer#  you have %d blank source!\n",pro);
       
        sem_post(&product_sem);
        c=(c+1)%SIZE;
    }
}
void destroy()
{
    sem_destroy(&product_sem);
    sem_destroy(&consumer_sem);
    exit(0);
}
void initsem()
{
    signal(2,destroy);
    int i=0;
    for(i=0;i<SIZE;++i)
        table[i]=0;
    sem_init(&product_sem,0,SIZE);
    sem_init(&consumer_sem,0,0);
}
int main()
{
    initsem();
    pthread_t product1,product2,consumer1,consumer2;
    pthread_create(&product1,NULL,product_fun,NULL);
    pthread_create(&product2,NULL,product_fun,NULL);
    pthread_create(&consumer1,NULL,consumer_fun,NULL);
    pthread_create(&consumer2,NULL,consumer_fun,NULL);
    pthread_join(product1,NULL);
    pthread_join(product2,NULL);
    pthread_join(consumer1,NULL);
    pthread_join(consumer2,NULL);
    return 0;
}

相關推薦

生產者消費者模型基於單鏈環形佇列執行消費生產

#include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <semaphore.h> #define SIZE 10 sem_t

java執行-生產者消費者模型有限緩衝問題

文章目錄 @[toc] 1.預備知識點 2.問題描述 3.java實現方式的預備知識 4.實現 1.預備知識點 執行緒同步 同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。“同

執行的同步互斥 互斥量 條件變數 訊號量生產者消費者模型

執行緒 執行緒是程序中的一個獨立的執行流,由環境(包括暫存器集和程式計數器)和一系列要執行的置零組成。所有程序至少有一個執行緒組成,多執行緒的程序包括多個執行緒,所有執行緒共享為程序分配的公共地址空間,所以文字段(Text Segment)和資料段(Datan

生產者消費者模型--基於posix訊號量的

基於posix訊號量的生產者於消費者模型 (此處只有一個生產者與一個消費者) 使用一個迴圈佇列作為生產者於消費者之間的交易場所,生產者向其中放資料,消費者從中拿取資料。為了達到同步使用posix訊號量。 posix 訊號量 訊號量就相當於一個計數器,記錄共享資源的份數。每當有一個

python:生產者消費者模型

target 代碼 所有 name body style pos 方便 tar 1,生產者與消費者模型的矛盾在於數據供需的不平衡 import time import random from multiprocessing import Queue from multip

使用Python線程實現生產者消費者模型

watermark vpd 51cto 實現 this read sleep get DG 1,我所使用到的python版本 2,下面編寫具體的實現過程 import threadingimport time import Queue #首先生成一個隊列q =Queue.

java簡單實現非同步佇列:使用生產者消費者模型

package com.yunshouhu; import java.util.concurrent.*; //java簡單實現非同步佇列:使用生產者與消費者模型 public class MyAsynQueue { // http://www.importnew.com/22519.h

生產者消費者模型std::condition_variable

std::condition_variable 為了解決死鎖而生的 當互斥操作不夠用而引入的 比如,執行緒可能需要等待某個條件為真才能繼續執行,而一個忙等待迴圈中可能會導致所有其他執行緒都無法進入臨界區使得條件為真時,就會發生死鎖。 所以,condition_va

守護程序,互斥鎖,IPC,佇列,生產者消費者模型

小知識點:在子程序中不能使用input輸入! 一.守護程序 守護程序表示一個程序b 守護另一個程序a 當被守護的程序結束後,那麼守護程序b也跟著結束了 應用場景:之所以開子程序,是為了幫助主程序完成某個任務,然而,如果主程序認為自己的事情一旦做完了就沒有必要使用子程序了,就可以將子程序設定為守護程序

守護程序,互斥鎖,IPC,生產者消費者模型

守護程序: b 程序守護 a程序,當a程序執行完畢時,b程序會跟著立馬結束 守護程序用途: 如果父程序結束了,子程序無需運行了,就可以將子程序設定為父程序的守護程序 例如我們qq視訊聊天時,當我們退出qq時,視訊介面會跟著退出,視訊就是qq的守護程序 守護程序語法: p.daemon = True #1.未

生產者消費者模型 及 條件變數

生產者與消費者問題 及 條件變數 什麼是生產者和消費者模型 生產者,顧名思義就是生產東西的人,而消費者就消費的人。在系統中,假設有一塊記憶體,生產者要向記憶體中放資料,而消費者要從記憶體區域中拿資料。這片記憶體區域可以被所有的執行緒訪問,所以這片記憶體區域就是臨界資源,而在對

Linux下生產者消費者模型

1. 概念   有一個或多個生產者生產某種型別的資料,並放在緩衝區裡(生產者),有一個消費者從緩衝區中取資料,每次取一項(消費者)。系統保證任何時候只有一個主題可以訪問快取區。所以當生產滿時,生產者不會再生產資料;當緩衝區為空時,消費者不會從中移走資料。 接下

生產者消費者模式執行的同步互斥

條件變數 條件變數的提出首先要涉及一個概念,就是生產者消費者模型: 生產者消費者,是在多執行緒同步的一個問題,兩個固定大小緩衝區的執行緒,在實際執行是會發生問題,生產者是生成資料放入緩衝區,重複過程,消費者在緩衝區取走資料。 生產者消費者的模型提出了三種關係,兩種角色,

生產者消費者模型初探

bsp spa 加速 投進 range shu 演示 clas NPU 1.引例 def producer(): r = [] for i in range(50): r.append(‘包子%s‘ % i) retur

第二十一講 執行——執行間的通訊——生產者消費者

首先,試著思考一下執行如下程式,看會得出什麼結果。 // 描述資源 class Res { private String name; // 資源名稱 private int count = 1; // 資源編號 // 定義標記。

第二十二講 執行——執行間的通訊——生產者消費者的升級解決方案

這裡我也是採用循序漸進的方式來講解JDK1.5版本中提供的多執行緒升級解決方案,希望能更加容易地讓大家接受。 為了解決多生產多消費的效率低下這一核心問題,在這兒我就告訴大家勢必要用到JDK1.5中jav

Java執行的實現程序執行的概念Java繼承Thread類實現執行Java實現Runnable介面實現執行ThreadRunnable的區別實現Callable介面實現執行

1 程序與執行緒 1.1 程序與執行緒的概念 什麼是程序?   程序: 作業系統中一個程式的執行週期。(比如我們想要在電腦上登入QQ,從雙擊qq按鈕---->關閉qq這個過程就是一個程序)   多程序: 同一時刻跑多個程式。   在DOS(磁碟作業系統時

基於TCP協議實現Linux下客戶端伺服器之間的通訊,實現執行程序伺服器

TCP是TCP/IP協議族中一個比較重要的協議,這是一種可靠、建立連結、面向位元組流的傳輸,工作在傳輸層。和TCP相對的不可靠、無連結、面向資料報的協議UDP,瞭解UDP客戶端與伺服器之間通訊請戳UDP協議實現的伺服器與客戶端通訊 TCP協議建立連線 首

Java執行中避免在生產者消費者場景中出現假死

在多執行緒程式設計中,如果所有執行緒全部都經由wait()方法進入等待狀態,那麼程式就進入了假死狀態 程式示例 考慮這個例子,來自《Java多執行緒程式設計核心技術》: 生產者類P: //生產者 public class P { private Stri

C/C++執行執行同步互斥鎖訊號量

參考連結2.中寫的非常好,簡單易懂,上手快,非常好的博文。使用多執行緒及互斥鎖樣例:#include <iostream> #include <windows.h> using namespace std; HANDLE hMutex = NULL;