生产者消费者问题(基于线程和无名信号量)

//5.生产者消费者问题
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#define MAX 50
#define BUFSIZE 10  //仓库的大小
int buf[BUFSIZE]={0};
int in=0;
int out=0;
sem_t full,empty;
void* producer(void* arg)
{
   int i;
   for (i = 1;i<=MAX;++i)
    {
       /*produce*/
       sem_wait(&full);
       buf[in++]=i;
       in%=BUFSIZE;
       printf("生产了第%d个产品\n" ,i);
       sem_post(&empty);
    }
   pthread_exit((void*)"thread1 exit\n");
}
void* comsumer(void* arg)
{
   int i,data_c;
   for (i = 1;i<= MAX; ++i)
    {
       /*comsumer*/
       sem_wait(&empty);
       data_c=buf[out++];
       out%=BUFSIZE;
       printf("消费了%d个产品\n" ,data_c);
       sem_post(&full);
    }
   pthread_exit((void*)"thread2 exit\n");
}
int main(void)
{
   void *tret;
   sem_init(&full,0,10);  //信号量的初始值为10和仓库的大小保持一致
   sem_init(&empty,0,0);
   pthread_t tid_producer,tid_comsumer;
   pthread_create(&tid_producer,NULL,producer,NULL);
   pthread_create(&tid_comsumer,NULL,comsumer,NULL);
   pthread_join(tid_producer,&tret);
   printf("%s\n",(char*)tret);
   pthread_join(tid_comsumer,&tret);
   printf("%s\n",(char*)tret);
   sem_destroy(&full);
   sem_destroy(&empty);
   return 0;
}此程序一定要注意信号量的个数一定要和仓库的存储空间大小数值上要一样大,此程序两个数都为10
时间: 2024-10-06 19:46:12

生产者消费者问题(基于线程和无名信号量)的相关文章

生产者消费者模型中线程怎样正常退出

生产者:不停地往队列中放数据 消费者:不停地从队列中拿数据 两者通过两个信号量同步 当生产者不再生产数据时,消费者正好挂在一个信号量上,处于睡眠状态,这时候pthread_join也会一直挂着的.该怎样使得消费者正常退出呢? 我的做法是让生产者在往队列中放一个[结束数据],也就是一个标识,消费者拿到数据后,如果这个数据是结束标识则自杀退出. 生产者消费者模型中线程怎样正常退出

多线程实现生产者消费者问题 详细注释 事件+临界区 信号量+临界区2种方法

生产者消费者问题:  该问题描述了两个共享固定大小缓冲区的线程--即所谓的"生产者"和"消费者"--在实际运行时会发生的问题.生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗这些数据.该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据.具体我就不解释了   应该都懂 不懂请百度一下 我是用事件实现生产者消费者问题的同步  用临界区实现互斥    我的这个做法与经典做法不同 即用信号量

生产者消费者问题-05-多线程

1 // 2 // ViewController.m 3 // 06-生产者消费者问题 4 // 5 // Created by mac on 16/4/20. 6 // Copyright © 2016年 mac. All rights reserved. 7 // 8 9 /*生产者消费者处理线程同步问题 10 思路: 11 1).生产者要取得锁,然后生产(去库房中放其生产的商品),如果库房满了,则wait,这时释放锁.直到有线程唤醒它再去生产:如果没有满,则生产商品后发送signal(消息

Android-Java多线程通讯(生产者 消费者)&amp;10条线程对-等待唤醒/机制的管理

上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 的基础上,扩大规模增加10条线程去执行 生产者 消费者: 注意:?? 上一篇博客是两条线程在执行(生产者 消费者)例如:当Thread-0 锁.wait(); 等待 冻结后,  Thread-1 锁.notify(); 唤醒的一定是 T

生产者消费者模型中线程如何正常退出

生产者:不停地往队列中放数据 消费者:不停地从队列中拿数据 两者通过两个信号量同步 当生产者不再生产数据时,消费者正好挂在一个信号量上,处于睡眠状态.这时候pthread_join也会一直挂着的.该如何使得消费者正常退出呢? 我的做法是让生产者在往队列中放一个[结束数据],也就是一个标识,消费者拿到数据后,假设这个数据是结束标识则自杀退出.

多线程、生产者消费者模型

目录 生产者消费者模型 生产者消费者模型 为什么要使用生产者和消费者模式 什么是生产者消费者模式 基于队列实现生产者消费者模型 多线程 什么是线程 开启线程的两种方式 线程与进程区别 Tread类的常用属性 守护线程 线程锁 生产者消费者模型 生产者消费者模型 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多

Java并发(基础知识)—— 阻塞队列和生产者消费者模式

1.阻塞队列 BlockingQueue是线程安全的Queue版本,从它的名字就可以看出,它是一个支持阻塞的Queue实现:当向空BlockingQueue请求数据时,它会阻塞至BlockingQueue非空:当向一个已满BlockingQueue插入数据时,线程会阻塞至BlockingQueue可插入. BlockingQueue 的方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:第一种是抛出一个异常,第二种是返回一个特殊值(null 或 fa

Java 并发编程(四)阻塞队列和生产者-消费者模式

阻塞队列 阻塞队列提供了可阻塞的 put 和 take 方法,以及支持定时的 offer 和 poll 方法.如果队列已经满了,那么put方法将阻塞直到有空间可以用:如果队列为空,那么take方法将一直阻塞直到有元素可用.队列可以使有界的,也可以是无界的,无界队列永远都不会充满,因此无界队列上的put方法永远不会阻塞.一种常见的阻塞生产者-消费者模式就是线程池与工作队列的组合,在 Executor 任务执行框架中就体现了这种模式. 意义:该模式能简化开发过程,因为他消除了生产者和消费者类之间的代

转: 【Java并发编程】之十三:生产者—消费者模型(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17249321 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据"姓名--1 --> 内容--1","姓名--2--> 内容--2",消费者不断交替地取得这两组数据,这里的"姓名--1&quo