生产者和消费者问题

合集下载

生产者与消费者问题实验报告

生产者与消费者问题实验报告

生产者与消费者问题实验报告篇一:生产者和消费者问题实验报告实验报告课程名称:操作系统实验名称:生产者和消费者问题学号:学生姓名:班级:指导教师:评分:实验日期:XX年 10月 22 日篇二:操作系统实验报告经典的生产者—消费者问题实验二经典的生产者—消费者问题一、目的实现对经典的生产者—消费者问题的模拟,以便更好的理解经典进程同步问题。

二、实验内容及要求编制生产者—消费者算法,模拟一个生产者、一个消费者,共享一个缓冲池的情形。

1、实现对经典的生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。

生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。

缓冲池被占用时,任何进程都不能访问。

2、每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。

在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。

他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。

三、生产者和消费者原理分析在同一个进程地址空间内执行两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。

四、生产者与消费者功能描述:生产者功能描述:在同一个进程地址空间内执行两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

消费者剩余和生产者剩余例题

消费者剩余和生产者剩余例题

消费者剩余和生产者剩余例题
消费者剩余和生产者剩余是微观经济学中的重要概念,用来衡
量市场交易对消费者和生产者的福利影响。

消费者剩余是指消费者
愿意为一定数量的产品支付的价格与其实际支付的价格之间的差额,代表了消费者因低于其愿意支付的价格而获得的福利。

生产者剩余
则是指生产者愿意以一定价格出售产品与其实际获得的价格之间的
差额,代表了生产者因高于其愿意接受的价格而获得的福利。

举个例子来说明消费者剩余和生产者剩余,假设某商品的市场
均衡价格为10元,某消费者愿意为该商品支付15元,但实际只需
支付10元购买到了该商品,那么该消费者的消费者剩余为15元-10
元=5元。

而在生产者方面,假设生产者愿意以5元的价格出售该商品,但实际可以以10元的价格出售,那么生产者的生产者剩余为
10元-5元=5元。

从消费者和生产者的角度看,消费者剩余和生产者剩余都是正
面的福利,代表了他们因市场交易而获得的好处。

消费者剩余衡量
了消费者愿意为产品付出的额外福利,而生产者剩余则衡量了生产
者以低于其愿意接受的价格出售产品所获得的额外福利。

总的来说,消费者剩余和生产者剩余的概念有助于我们理解市场交易对消费者和生产者福利的影响,也有助于政府和企业制定相关政策和战略。

希望这个例子能够帮助你更好地理解消费者剩余和生产者剩余的概念。

生产者与消费者问题

生产者与消费者问题

⽣产者与消费者问题⽣产者与消费者问题是Java多线程中⼀道⾮常经典的问题,问题如下: ⽣产者与消费者问题也称缓存问题,⽣产者与消费者即Java 中的线程,⽣产者与消费者问题即⽣产者⽣产⼀定数量的线程放⼊缓存区中,供消费者消费者消费,在消费和⽣产的过程中,如果⽣产者⽣产的产品超过了缓存区的上限则停⽌⽣产,等待消费者消费,如果缓存区的产品被消费完,消费者则停⽌消费,等待⽣产者⽣产 ⾸先,我们来看题⽬,从题⽬中我们⼀个可以抽取出⼏个实体类呢?答案是4个 Consumer(消费者),Producer(⽣产者),Product(产品),WareHouse(缓冲区,也叫仓库),于是项⽬结构如下,main 为测试类产品类package ProducersAndConsumers;//产品public class Product {//产品需要⼀个id 来表明产品的唯⼀性private Integer productId;//id直接由构造⽅法传⼊public Product(Integer productId) {this.productId = productId;}public Integer getProductId() {return productId;}@Overridepublic String toString() {return "Product{" +"productId=" + productId +'}';}}仓库package ProducersAndConsumers;import java.util.LinkedList;//仓库类public class WareHouse {//仓库容量,我们设置为10个private final int max = 10;//仓库基础的数量private final int base = 0;//我们设置⼀个集合来存放⽣产的产品,由于我们需要⼀个可以弹出最后⼀个产品的⽅法,所以我们在这⾥使⽤LinkedListprivate LinkedList<Product> products = new LinkedList<>();//⽣产⽅法public synchronized void push(Product product) {//判断是否有空间存放产品while(max==products.size()){try{System.out.println("仓库已满,消费者快来消费"+Thread.currentThread().getName()+"停⽌⽣产");//仓库满后停⽌当前线程this.wait();}catch (Exception ex){ex.printStackTrace();}}//⽣产商品products.addLast(product);System.out.println(Thread.currentThread().getName()+"⽣产了⼀个产品:"+product.getProductId()+"号");try{//等待1秒,⽅⾯我们观察Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}notifyAll();}//消费⽅法public synchronized void pop() {//判断是否有产品while (products.size()==base){try{System.out.println("仓库空了,⽣产者快点⽣产"+Thread.currentThread().getName()+"停⽌消费");//仓库空后停⽌当前线程this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//消费商品System.out.println(Thread.currentThread().getName()+"消费了⼀个产品:"+products.getLast().getProductId()+"号"); products.removeLast();try{//等待1秒,⽅⾯我们观察Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}notifyAll();}}⽣产者package ProducersAndConsumers;//⽣产者public class Producer implements Runnable {//⽣产产品的idprivate int count = 0;//仓库private WareHouse wareHouse;//⽣产者和消费者都是⽤同⼀个仓库,所以我们只要声明⼀个仓库,在由构造⽅法传⼊即可public Producer(WareHouse wareHouse) {this.wareHouse = wareHouse;}//⽣产⽅法@Overridepublic void run() {while (true){Product product = new Product(count);wareHouse.push(product);// 产品id不可重复,所以我们使⽤⾃增策略count++;}}}消费者package ProducersAndConsumers;public class Consumer implements Runnable{//仓库private WareHouse wareHouse;//⽣产者和消费者都是⽤同⼀个仓库,所以我们只要声明⼀个仓库,在由构造⽅法传⼊即可public Consumer(WareHouse wareHouse) {this.wareHouse = wareHouse;}//消费⽅法@Overridepublic void run() {while (true){wareHouse.pop();}}}最后测试类package ProducersAndConsumers;//测试类public class Main {public static void main(String[] args) {WareHouse wareHouse = new WareHouse();Producer producer = new Producer(wareHouse);Consumer consumer = new Consumer(wareHouse); Thread producerT = new Thread(producer,"⽣产者"); Thread consumerT = new Thread(consumer,"消费者"); producerT.start();consumerT.start();}}。

生产者和消费者问题

生产者和消费者问题

一、生产者和消费者问题1、一个生产者和一个消费者情况:main (){ int S=1; //可否进入缓冲区int S0=0; //产品数目int Sn=n //可用缓冲区数producer();consumer();}producer(){produce a productP(Sn);P(S);Put the product into bufferV(S0);V(S);}consumer(){P(S0);P(S);Take a product from bufferV(Sn);V(S);Consume the product}2、m个生产者和k个消费者共享n个缓冲区的情况:main(){int B[n]; //缓冲区int p=r=0; //p表示生产者指针,r表示消费者指针int S=1; //可否进入缓冲区int S0=0; //产品数目int Sn=n; //可用缓冲区数producer();consumer();}producer(){while (producing does not end ){produce a productP(Sn);P(S);B[p]=product;p=(p+1)mod n; //每放入一个产品,位置指针后移一位V(S0);V(S);}}consumer(){while (continue to consume){P(S0);P(S);Take a product from B[r]r=(r+1)mod n; // 从第一个开始,消费一个后,指向下一个V(Sn);V(S);Consume}}二、读者与写者问题1、读者与写者有相同的优先级的情况:main(){int S=1; //读者与写者,写者与写者间的互斥,即可否修改文件int Sr=1; //可否修改读者个数int rc=0; //读者个数reader();writer();}reader(){P(Sr);rc=rc+1;if(rc==1) P(S);V(Sr);read file FP(Sr);rc=rc-1;if(rc==0) V(S);V(Sr);}writer(){P(S);Write file FV(S);}2、写者优先问题:main(){int S=1; //可否修改文件int Sn=n; //最多有n个进程可以同时进行读操作reader();writer()}reader(){P(S);P(Sn);V(S);Read file FV(Sn);}writer(j){P(S)for (int i=1;i<=n;i++) P(Sn);Write file Ffor(i=1; i<=n; i++) V(Sn);V(S);}例题1、有一个阅览室,读者进入时必须先在一张登记表上进行登记。

生产者消费者问题例题及详解

生产者消费者问题例题及详解

生产者消费者问题例题及详解生产者消费者问题是一个经典的并发问题,涉及到两个独立的线程:生产者和消费者。

生产者生产物品,消费者消费物品。

生产者、消费者共享一个公共的固定大小的缓冲区。

以下是一个简单的生产者消费者问题的例子:假设有一个固定大小的缓冲区,大小为N。

生产者负责生成数据放入缓冲区,而消费者负责从缓冲区取出数据并处理。

1. 当缓冲区为空时,消费者被阻塞,等待生产者生产数据。

2. 当缓冲区满时,生产者被阻塞,等待消费者消费数据。

3. 缓冲区的每个元素只能被消费一次。

4. 缓冲区是循环使用的,即当缓冲区的最后一个元素被消费后,下一个元素将是缓冲区的第一个元素。

问题:如何实现这个生产者消费者模型?解答:可以使用条件变量和互斥锁来实现这个模型。

首先,定义一个缓冲区数组和一个计数器变量来跟踪缓冲区的使用情况。

然后,定义两个条件变量:一个用于生产者等待缓冲区非空,另一个用于消费者等待缓冲区非空。

最后,使用互斥锁来保护对缓冲区和计数器的访问。

以下是使用C++实现的代码示例:```cppinclude <iostream>include <thread>include <mutex>include <condition_variable>const int N = 5; // 缓冲区大小int buffer[N]; // 缓冲区数组int count = 0; // 计数器变量,表示缓冲区的使用情况std::mutex mutex; // 互斥锁std::condition_variable cv_prod; // 生产者等待条件变量std::condition_variable cv_cons; // 消费者等待条件变量void producer() {for (int i = 0; i < N 2; i++) {std::unique_lock<std::mutex> lock(mutex);cv_(lock, []{ return count < N; }); // 等待缓冲区非空buffer[count] = i; // 生产数据放入缓冲区std::cout << "Producer produced " << i << std::endl;count++; // 更新计数器变量if (count == N) count = 0; // 循环使用缓冲区cv__one(); // 通知消费者消费数据}}void consumer() {for (int i = 0; i < N 2; i++) {std::unique_lock<std::mutex> lock(mutex);cv_(lock, []{ return count > 0; }); // 等待缓冲区非空int data = buffer[count]; // 从缓冲区取出数据并处理 std::cout << "Consumer consumed " << data << std::endl;count--; // 更新计数器变量if (count == -1) count = N - 1; // 循环使用缓冲区cv__one(); // 通知生产者生产数据}}int main() {std::thread prod(producer); // 创建生产者线程 std::thread cons(consumer); // 创建消费者线程 (); // 等待生产者线程结束(); // 等待消费者线程结束return 0;}```。

操作系统中的经典问题——生产者消费者问题(两种方式实现)

操作系统中的经典问题——生产者消费者问题(两种方式实现)

操作系统中的经典问题——⽣产者消费者问题(两种⽅式实现)操作系统中的经典问题——⽣产者消费者问题(两种⽅式实现)1、问题引⼊:什么是⽣产者消费者问题?⽣产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是⼀个多线程同步问题的经典案例。

该问题描述了共享固定⼤⼩缓冲区的两个线程——即所谓的“⽣产者”和“消费者”——在实际运⾏时会发⽣的问题。

⽣产者的主要作⽤是⽣成⼀定量的数据放到缓冲区中,然后重复此过程。

与此同时,消费者也在缓冲区消耗这些数据。

该问题的关键就是要保证⽣产者不会在缓冲区满时加⼊数据,消费者也不会在缓冲区中空时消耗数据。

.要解决该问题,就必须让⽣产者在缓冲区满时休眠(要么⼲脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,⽣产者才能被唤醒,开始往缓冲区添加数据。

同样,也可以让消费者在缓冲区空时进⼊休眠,等到⽣产者往缓冲区添加数据之后,再唤醒消费者。

通常采⽤进程间通信的⽅法解决该问题。

如果解决⽅法不够完善,则容易出现死锁的情况。

出现死锁时,两个线程都会陷⼊休眠,等待对⽅唤醒⾃⼰。

该问题也能被推⼴到多个⽣产者和消费者的情形。

2、问题分析该问题需要注意的⼏点:1. 在缓冲区为空时,消费者不能再进⾏消费2. 在缓冲区为满时,⽣产者不能再进⾏⽣产3. 在⼀个线程进⾏⽣产或消费时,其余线程不能再进⾏⽣产或消费等操作,即保持线程间的同步4. 注意条件变量与互斥锁的顺序由于前两点原因,因此需要保持线程间的同步,即⼀个线程消费(或⽣产)完,其他线程才能进⾏竞争CPU,获得消费(或⽣产)的机会。

对于这⼀点,可以使⽤条件变量进⾏线程间的同步:⽣产者线程在product之前,需要wait直⾄获取⾃⼰所需的信号量之后,才会进⾏product的操作;同样,对于消费者线程,在consume之前需要wait直到没有线程在访问共享区(缓冲区),再进⾏consume的操作,之后再解锁并唤醒其他可⽤阻塞线程。

生产者消费者问题实验报告

生产者消费者问题实验报告

操作系统课程设计实验报告实验名称: 生产者消费者问题姓名/学号:一、实验目的以生产者和消费者问题为例, 学习Linux和Windows下进程通信、同步机制的具体实现方法, 主要是信号量和共享内存。

熟悉相关系统API的用法。

二、实验内容使用共享内存和信号量机制来实现多个生产者/消费者进程间的通信和同步。

要求在Linux和Windows下分别实现。

缓冲区大小为3, 初始为空。

2个生产者, 随机等待一段时间, 往缓冲区添加数据, 重复6次。

3个消费者, 重复4次。

三、实验环境Ubuntu 10.10 , GCC; Windows 7, VC 6.0;四、程序设计与实现1.Linux下:(1) 数据结构:a.共享内存定义为一个结构, 使得其数据成员更清晰且操作变得简单。

b.共享缓冲区采用循环队列的数据结构,由上面的结构struct buf { int start; int end; int info[BUF_NUM]; }维护。

其中start为队头指针, end为队尾指针, info为数据区域。

(2) 算法:a.大致由三个模块组成:i.主程序(main):ii.创建信号量、共享内存并进行初始化iii.创建生产者、消费者进程, 生产者执行pro_fun(), 消费者执行con_fun()iv.等待所有子进程的结束v.删除信号量、共享内存i.生产者进程(pro_fun):ii.通过key获得信号量、共享内存的ID, 将内存添加到自己的地址空间iii.P(empty), P(mutex), Add(data), V(mutex), V(full)iv.解除和共享内存的关联i.消费者进程(con_fun):ii.通过key获得信号量、共享内存的ID, 将内存添加到自己的地址空间iii.P(full), P(mutex), Add(data), V(mutex), V(empty)iv.解除和共享内存的关联循环队列部分:加入数据: info[end] = value; end = (end + 1) % 3;取出数据: temp = info[start]; info[start] = 0; (start = start + 1)%3; return temp;(3) 程序流程图:a.主函数:b.生产者进程:c.消费者进程和生产者类似4.Windows 下:(1) 数据结构:和Linux大致相同(2) 算法:a.创建的子进程调用正在执行的文件本身, 通过main函数的参数区分主进程和生产者、消费者进程。

生产者—消费者问题

生产者—消费者问题

第一章、概述1.1 课题背景在多道程序环境下,进程同步问题十分重要,也是一个相当有趣的问题,因而吸引了不少学者对它进行研究,并由此而产生了一系列经典的进程同步问题。

其中比较有代表性的有“生产者—消费者问题” 、“读者—写者问题” 、“哲学家进餐问题”等等。

通过对这些问题的研究和学习,可以帮助我们更好地理解进程同步概念及实现方法。

1.2生产者—消费者问题生产者—消费者问题(Producer_consumer)是一个经典的进程同步问题。

它描述的是:有一群生产者进程在生产产品,并将此产品提供给消费者进程去消费。

为使生产者进程和消费者进程能并发执行,在它们之间设置有个缓冲区的缓冲池,生产者进程可将它所生产的产品放入一个缓冲区中,消费者进程可从一个缓冲区取得一个产品消费。

尽管所有的生产者进程和消费者进程都是以异步的方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装有消息尚未被取走产品的缓冲区投放产品。

如下图所示:1.3进程同步机制在中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在它们争用临界资源的时候。

例如,当多个进程去争用一台打印机时,有可能使多个进程的输出结果交织在一起,难于区分;而当多个进程去争用共享变量,表格,链表时,有可能使数据处理出错。

进程同步的主要任务就是使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

1.4进程同步优点进程同步其优点在于能够让操作系统更加有效地对资源进行管理和调度,最大潜力地发挥处理机的性能。

让系统的执行更加畅通无阻,尽可能地让系统少出现一些由于系统资源分配不合理所带来的死锁、死机之类的事情的发生。

保持了处理机的高速运行之后从用户角度来说程序运行所花费的时间就会更短。

从而保证了处理机在相同的时间内有更大的吞吐量。

而把并发进程的同步和互斥问题一般化,就可以得到一个抽象的一般模型,即本次课程设计的任务:生产者—消费者问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

班级姓名:学号:成绩:实验名称: 生产者和消费者问题1.实验目的:“生产者消费者”问题是一个著名的同时性编程问题的集合。

通过编写经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux 中多线程编程,并且掌握用信号量处理线程间的同步互斥问题。

2.实验内容:“生产者消费者”问题描述如下。

有一个有限缓冲区和两个线程:生产者和消费者。

他们分别把产品放入缓冲区和从缓冲区中拿走产品。

当一个生产者在缓冲区满时必须等待,当一个消费者在缓冲区空时也必须等待。

它们之间的关系如下图所示:这里要求用有名管道来模拟有限缓冲区,用信号量来解决生产者消费者问题中的同步和互斥问题。

3.实验方法:(1)使用信号量解决(2)思考使用条件变量解决4.实验过程(1)信号量的考虑这里使用3个信号量,其中两个信号量avail和full分别用于解决生产者和消费者线程之间的同步问题,mutex是用于这两个线程之间的互斥问题。

其中avail初始化为N(有界缓冲区的空单元数),mutex 初始化为1,full初始化为0。

/**/#include <>#include <>#include <>#include <>#include <>#include <sys/>#include <>#include <>#define FIFO "myfifo"#define N 5int lock_var;time_t end_time;char buf_r[100];sem_t mutex,full,avail;int fd;void pthread1(void *arg);void pthread2(void *arg);int main(int argc, char *argv[]){pthread_t id1,id2;pthread_t mon_th_id;int ret;end_time = time(NULL)+30;/*创建有名管道*/if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST)) printf("cannot create fifoserver\n");printf("Preparing for reading bytes...\n");memset(buf_r,0,sizeof(buf_r));/*打开管道*/fd=open(FIFO,O_RDWR|O_NONBLOCK,0);if(fd==-1){perror("open");exit(1);}/*初始化互斥信号量为1*/ret=sem_init(&mutex,0,1);/*初始化avail信号量为N*/ret=sem_init(&avail,0,N);/*初始化full信号量为0*/ret=sem_init(&full,0,0);if(ret!=0){perror("sem_init");}/*创建两个线程*/ret=pthread_create(&id1,NULL,(void *)productor, NULL); if(ret!=0)perror("pthread cread1");ret=pthread_create(&id2,NULL,(void *)consumer, NULL); if(ret!=0)perror("pthread cread2");pthread_join(id1,NULL);pthread_join(id2,NULL);exit(0);}/*生产者线程*/void productor(void *arg){int i,nwrite;while(time(NULL) < end_time){/*P操作信号量avail和mutex*/sem_wait(&avail);sem_wait(&mutex);/*生产者写入数据*/if((nwrite=write(fd,"hello",5))==-1){if(errno==EAGAIN)printf("The FIFO has not been read try later\n"); }elseprintf("write hello to the FIFO\n");/*V操作信号量full和mutex*/sem_post(&full);sem_post(&mutex);sleep(1);}}/*消费者线程*/void consumer(void *arg){int nolock=0;int ret,nread;while(time(NULL) < end_time){/*P操作信号量full和mutex*/sem_wait(&full);sem_wait(&mutex);memset(buf_r,0,sizeof(buf_r));if((nread=read(fd,buf_r,100))==-1){if(errno==EAGAIN)printf("no data yet\n");}printf("read %s from FIFO\n",buf_r);/*V操作信号量avail和mutex*/sem_post(&avail);sem_post(&mutex);sleep(1);}}(2)条件变量的考虑#include <>#include <>#define BUFFER_SIZE 4#define OVER (-1)struct producers//定义生产者条件变量结构{int buffer[BUFFER_SIZE];pthread_mutex_t lock;int readpos, writepos;pthread_cond_t notempty;pthread_cond_t notfull;};//初始化缓冲区void init(struct producers *b){pthread_mutex_init(&b->lock,NULL);pthread_cond_init(&b->notempty,NULL);pthread_cond_init(&b->notfull,NULL);b->readpos=0;b->writepos=0;}//在缓冲区存放一个整数void put(struct producers *b, int data){pthread_mutex_lock(&b->lock);//当缓冲区为满时等待while((b->writepos+1)%BUFFER_SIZE==b->readpos) {pthread_cond_wait(&b->notfull,&b->lock);}b->buffer[b->writepos]=data;b->writepos++;if(b->writepos>=BUFFER_SIZE) b->writepos=0; //发送当前缓冲区中有数据的信号pthread_cond_signal(&b->notempty);pthread_mutex_unlock(&b->lock);}int get(struct producers *b){int data;pthread_mutex_lock(&b->lock);while(b->writepos==b->readpos){pthread_cond_wait(&b->notempty,&b->lock); }data=b->buffer[b->readpos];b->readpos++;if(b->readpos>=BUFFER_SIZE) b->readpos=0; pthread_cond_signal(&b->notfull);pthread_mutex_unlock(&b->lock);return data;}struct producers buffer;void *producer(void *data){int n;for(n=0;n<10;n++){printf("Producer : %d-->\n",n);put(&buffer,n);}put(&buffer,OVER);return NULL;}void *consumer(void *data){int d;while(1){d=get(&buffer);if(d==OVER) break;printf("Consumer: --> %d\n",d);}return NULL;}int main(){pthread_t tha,thb;void *retval;init(&buffer);pthread_create(&tha,NULL,producer,0); pthread_create(&thb,NULL,consumer,0);pthread_join(tha,&retval); pthread_join(thb,&retval); return 0;}。

相关文档
最新文档