`

(第四章 2)生产者-消费者模型

 
阅读更多

输出大致像这样:

 

[hadoop@sam1 test]$ ./producer_consumer 
[P0] Producing 0 ...
[P1] Producing 0 ...
[P1] Producing 1 ...
[P0] Producing 1 ...
------> [C1] Comsuming 0 ...
------> [C1] Comsuming 0 ...
[P2] Producing 0 ...
[P2] Producing 1 ...
------> [C2] Comsuming 1 ...
------> [C0] Comsuming 1 ...
------> [C0] Comsuming 0 ...
------> [C1] Comsuming 1 ...
[P1] Producing 2 ...
[P1] Producing 3 ...
------> [C0] Comsuming 2 ...
------> [C0] Comsuming 3 ...
[P0] Producing 2 ...
[P2] Producing 2 ...
------> [C2] Comsuming 2 ...
[P2] Producing 3 ...
[P0] Producing 3 ...
------> [C1] Comsuming 2 ...
------> [C2] Comsuming 3 ...
------> [C2] Comsuming 3 ...

 

代码:

 

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include </usr/include/semaphore.h>

#define BUFF_SIZE   5		/* total number of slots */
#define NP          3		/* total number of producers */
#define NC          3		/* total number of consumers */
#define NITERS      4		/* number of items produced/consumed */

typedef struct {
    int buf[BUFF_SIZE];   /* shared var */
    int in;         	  /* buf[in%BUFF_SIZE] is the first empty slot */
    int out;        	  /* buf[out%BUFF_SIZE] is the first full slot */
    sem_t full;     	  /* keep track of the number of full spots */
    sem_t empty;    	  /* keep track of the number of empty spots */
    sem_t mutex;    	  /* enforce mutual exclusion to shared data */
} sbuf_t;

sbuf_t shared;

void *Producer(void *arg)
{
    int i, item, index;

    //index是线程编号
    index = (int)arg;

    for (i=0; i < NITERS; i++) {

        /* Produce item */
        item = i;	

        /* Prepare to write item to buf ??*/

        /* If there are no empty slots, wait */
        sem_wait(&shared.empty); 
        /* If another thread uses the buffer, wait */
        sem_wait(&shared.mutex);

        shared.buf[shared.in] = item;
        shared.in = (shared.in+1)%BUFF_SIZE;
        printf("[P%d] Producing %d ...\n", index, item);
	fflush(stdout);

        /* Release the buffer */
        sem_post(&shared.mutex);
        /* Increment the number of full slots */
        sem_post(&shared.full);

        /* Interleave  producer and consumer execution */
        if (i % 2 == 1) sleep(1);
    }
    return NULL;
}

void *Consumer(void *arg)
{
    /* Fill in the code here */
	int i,item,index;
	index=(int)arg;

	for(i=0;i<NITERS;i++){
		item=i;
		sem_wait(&shared.full);
		sem_wait(&shared.mutex);

		printf("------> [C%d] Comsuming %d ...\n",index,shared.buf[shared.out]);
		//fflush(stdout);	
		shared.out=(shared.out+1)%BUFF_SIZE;

		sem_post(&shared.mutex);
		sem_post(&shared.empty);
	}
	return NULL;
}

int main()
{
    pthread_t idP, idC;
    int index;

    //注意:
    //1. 信号量一定要初始化,否则程序卡住,而且不报错
    //2. value=1的信号量等同于互斥锁??
    sem_init(&shared.mutex,0,1);
    sem_init(&shared.full, 0, 0);
    sem_init(&shared.empty, 0, BUFF_SIZE);

    /* Insert code here to initialize mutex*/

    for (index = 0; index < NP; index++)
    {  
       /* Create a new producer */
       pthread_create(&idP, NULL, Producer, (void*)index);
    }

    /* Insert code here to create NC consumers */
	for(index=0;index<NC;index++){
		pthread_create(&idC,NULL,Consumer,(void*)index);
	}

    pthread_exit(NULL);//仅仅结束主线程,进程不结束(对其他子线程不影响)
}

 

分享到:
评论

相关推荐

    多进程同步解决生产者消费者问题(c++源码)

    ### 多进程同步解决生产者消费者问题(C++源码解析) #### 一、问题背景与定义 生产者-消费者问题是一种经典的并发编程问题,它最初由Edsger Dijkstra提出,用来展示信号量机制的应用场景。在这个问题中,存在两类...

    四川大学操作系统课程设计高分报告-第三次实验-生产者和消费者问题.doc

    实验的目标包括掌握同步互斥算法、理解生产者-消费者模型,以及学习Windows中的多线程并发执行机制和同步对象API。 实验步骤简单地概述了读懂和修改源程序的过程,表明实验涉及到了代码阅读和编写。 实验陈述部分...

    【IT十八掌徐培成】Java基础第08天-04.多线程-生产者-消费者.zip

    4. ** 示例代码**:一个简单的生产者-消费者模型可以通过以下代码示例来理解: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main...

    操作系统课程设计生产者和消费者问题源代码

    本实验所使用的生产者和消费者模型具有如下特点: 本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 消费者只消费指定生产者的产品。 在测试用例文件中指定...

    生产者消费者模型的演变

    生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...

    【IT十八掌徐培成】Java基础第08天-05.多线程-生产者-消费者2.zip

    1. **共享资源**:在生产者-消费者模型中,有一个共享的数据结构,通常是一个队列,用于存储生产者产生的产品。在Java中,可以使用 `ArrayBlockingQueue` 或 `LinkedBlockingQueue` 这样的并发容器来实现。 2. **...

    并行openmp程序实现生产者消费者

    在《机械工业出版社 并行程序设计导论》第五章的练习题5.6中,可能要求读者设计并实现一个这样的模型,以理解和掌握OpenMP的并行化机制以及生产者消费者模式的基本概念。通常,这类练习会涉及到以下知识点: 1. **...

    生产者和消费者问题程序

    本实验所使用的生产者和消费者模型具有如下特点: 本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 消费者只消费指定生产者的产品。 在测试用例文件中指定...

    生产者消费者算法

    生产者消费者模型通常包含以下几个关键部分: 1. **缓冲区**:这是生产者和消费者共享的数据结构,用于存储产品。由于资源有限,缓冲区有固定的大小,比如可以是环形数组。 2. **互斥量(mutex)**:确保任何时候...

    操作系统 生产者消费者问题

    通过阅读和分析这段代码,你可以深入理解如何在实际编程中应用信号量解决并发问题,以及如何通过多线程实现生产者消费者模型。此外,这个程序已经编译并可以运行,这为你提供了验证和调试同步策略的实践机会。 总的...

    生产者和消费者问题以及哲学家就餐问题,JAVA实现的程序.rar

    生产者消费者问题是多线程协同工作的模型之一,主要涉及到两个角色:生产者和消费者。生产者负责生成数据,而消费者则消费这些数据。在Java中,这个问题通常通过使用`java.util.concurrent`包中的`BlockingQueue`来...

    第4章:IS-LM模型PPT课件.ppt

    IS-LM模型是宏观经济分析中的一个关键工具,用于理解货币市场和实物市场的相互作用如何决定利率和国民收入。这个模型由两条曲线组成:IS曲线和LM曲线。 4.1 投资函数 投资函数描述了利率(r)与投资支出(I)之间的...

    完整第十七章 总需求----总供给模型.doc

    总需求曲线表示在不同价格水平下,市场上所有消费者、企业、政府和外国对国内商品和服务的需求总量。在凯恩斯主义框架下,总需求由消费支出(C)、投资支出(I)、政府支出(G)和净出口(NX)四部分组成,即TD = C ...

    springcloud生产者消费者商城支付源代码

    在本项目中,"springcloud生产者消费者商城支付源代码" 是一个基于Spring Cloud框架构建的电子商务系统的实现,主要用于演示和学习如何运用生产者-消费者模式处理支付相关的业务逻辑。这个系统包含了多个关键模块,...

    宏观经济学原理课后习题及答案-第十二章国民收入的决定:收入-支出模型.pdf

    边际消费倾向总是大于零而小于 1,因为一般来说,消费者增加收入后,不会分文消费不增加,也不会把增加的收入全用于增加消费,一般情况是一部分用于增加消费,另一部分用于增加储蓄。平均消费倾向就不一定总是大于零...

    C语言,消费者和生产者模式

    在生产者-消费者模型中,条件变量常用于处理队列满或空的情况。C语言中,可以使用`pthread_cond_t`类型定义条件变量,并结合`pthread_cond_wait()`和`pthread_cond_signal()`函数来实现线程间的协作。 3. **环形...

    精品专题(2021-2022年收藏)pv操作和生产者消费者.doc

    生产者-消费者问题的变体,如多个生产者和消费者或者多缓冲区的情况,可以通过设置多个信号量并结合适当的逻辑来解决,以保证生产者和消费者之间的正确同步和互斥。理解PV操作和信号量的概念以及如何应用它们,对于...

    实现生产者消费者问题操作系统课程设计报告.doc

    4. **堆栈**:在某些实现中,堆栈也可能被用来模拟缓冲区,但不如循环队列常见,因为堆栈只支持后进先出(LIFO)操作,可能不完全符合生产者消费者问题的需求。 5. **条件变量**:在某些高级操作系统中,除了信号量...

    第5章短期经济波动模型:AD-AS模型.ppt

    第五章主要讨论的是短期经济波动模型,即AD-AS(总需求-总供给)模型,这个模型考虑了价格因素在国民收入决定中的作用,弥补了IS-LM模型中价格不变的假设。AD-AS模型旨在解释经济如何在不只考虑产出水平,也考虑价格...

    第17章--国民收入的决定:总需求--总供给模型.pptx

    消费需求来自家庭部门,受到可支配收入、消费者信心和利率等因素的影响;投资需求涉及企业对新资本设备的购买,与预期收益和利率水平密切相关;政府需求主要是政府支出,包括公共工程和转移支付;国外需求即净出口,...

Global site tag (gtag.js) - Google Analytics