输出大致像这样:
[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++源码解析) #### 一、问题背景与定义 生产者-消费者问题是一种经典的并发编程问题,它最初由Edsger Dijkstra提出,用来展示信号量机制的应用场景。在这个问题中,存在两类...
实验的目标包括掌握同步互斥算法、理解生产者-消费者模型,以及学习Windows中的多线程并发执行机制和同步对象API。 实验步骤简单地概述了读懂和修改源程序的过程,表明实验涉及到了代码阅读和编写。 实验陈述部分...
4. ** 示例代码**:一个简单的生产者-消费者模型可以通过以下代码示例来理解: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main...
本实验所使用的生产者和消费者模型具有如下特点: 本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 消费者只消费指定生产者的产品。 在测试用例文件中指定...
生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...
1. **共享资源**:在生产者-消费者模型中,有一个共享的数据结构,通常是一个队列,用于存储生产者产生的产品。在Java中,可以使用 `ArrayBlockingQueue` 或 `LinkedBlockingQueue` 这样的并发容器来实现。 2. **...
在《机械工业出版社 并行程序设计导论》第五章的练习题5.6中,可能要求读者设计并实现一个这样的模型,以理解和掌握OpenMP的并行化机制以及生产者消费者模式的基本概念。通常,这类练习会涉及到以下知识点: 1. **...
本实验所使用的生产者和消费者模型具有如下特点: 本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 消费者只消费指定生产者的产品。 在测试用例文件中指定...
生产者消费者模型通常包含以下几个关键部分: 1. **缓冲区**:这是生产者和消费者共享的数据结构,用于存储产品。由于资源有限,缓冲区有固定的大小,比如可以是环形数组。 2. **互斥量(mutex)**:确保任何时候...
通过阅读和分析这段代码,你可以深入理解如何在实际编程中应用信号量解决并发问题,以及如何通过多线程实现生产者消费者模型。此外,这个程序已经编译并可以运行,这为你提供了验证和调试同步策略的实践机会。 总的...
生产者消费者问题是多线程协同工作的模型之一,主要涉及到两个角色:生产者和消费者。生产者负责生成数据,而消费者则消费这些数据。在Java中,这个问题通常通过使用`java.util.concurrent`包中的`BlockingQueue`来...
IS-LM模型是宏观经济分析中的一个关键工具,用于理解货币市场和实物市场的相互作用如何决定利率和国民收入。这个模型由两条曲线组成:IS曲线和LM曲线。 4.1 投资函数 投资函数描述了利率(r)与投资支出(I)之间的...
总需求曲线表示在不同价格水平下,市场上所有消费者、企业、政府和外国对国内商品和服务的需求总量。在凯恩斯主义框架下,总需求由消费支出(C)、投资支出(I)、政府支出(G)和净出口(NX)四部分组成,即TD = C ...
在本项目中,"springcloud生产者消费者商城支付源代码" 是一个基于Spring Cloud框架构建的电子商务系统的实现,主要用于演示和学习如何运用生产者-消费者模式处理支付相关的业务逻辑。这个系统包含了多个关键模块,...
边际消费倾向总是大于零而小于 1,因为一般来说,消费者增加收入后,不会分文消费不增加,也不会把增加的收入全用于增加消费,一般情况是一部分用于增加消费,另一部分用于增加储蓄。平均消费倾向就不一定总是大于零...
在生产者-消费者模型中,条件变量常用于处理队列满或空的情况。C语言中,可以使用`pthread_cond_t`类型定义条件变量,并结合`pthread_cond_wait()`和`pthread_cond_signal()`函数来实现线程间的协作。 3. **环形...
生产者-消费者问题的变体,如多个生产者和消费者或者多缓冲区的情况,可以通过设置多个信号量并结合适当的逻辑来解决,以保证生产者和消费者之间的正确同步和互斥。理解PV操作和信号量的概念以及如何应用它们,对于...
4. **堆栈**:在某些实现中,堆栈也可能被用来模拟缓冲区,但不如循环队列常见,因为堆栈只支持后进先出(LIFO)操作,可能不完全符合生产者消费者问题的需求。 5. **条件变量**:在某些高级操作系统中,除了信号量...
第五章主要讨论的是短期经济波动模型,即AD-AS(总需求-总供给)模型,这个模型考虑了价格因素在国民收入决定中的作用,弥补了IS-LM模型中价格不变的假设。AD-AS模型旨在解释经济如何在不只考虑产出水平,也考虑价格...
消费需求来自家庭部门,受到可支配收入、消费者信心和利率等因素的影响;投资需求涉及企业对新资本设备的购买,与预期收益和利率水平密切相关;政府需求主要是政府支出,包括公共工程和转移支付;国外需求即净出口,...