#include <stdio.h>
#include <semaphore.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h> #define N1 3//定义3个生产者
#define N2 4//定义4 个消费者
#define M 10//定义10个大小缓冲区 int in = ;
int out = ; int buff[M] = {};//缓冲区大小为10 sem_t empty_sem;//空缓冲区数量
sem_t full_sem;//满缓冲区数量
pthread_mutex_t mutex;//互斥访问缓冲区 int product_id = ;
int consumer_id = ; int data;
FILE *fp; void * product()
{
int id = ++product_id;
while()
{
sleep();
sem_wait(&empty_sem);
pthread_mutex_lock(&mutex);
//if(feof(fp) != 0) fseek(fp, 0, SEEK_SET);
if(fscanf(fp, "%d", &data)==EOF)
{
fseek(fp, , SEEK_SET);
fscanf(fp, "%d", &data);
}
in = in % M;
buff[in] = data;
printf("Producter %d produce %d in position %d\n", id, buff[in], in);
++in;
pthread_mutex_unlock(&mutex);
sem_post(&full_sem);
}
} void *consume()
{
int id = ++consumer_id; while()
{
sleep();
sem_wait(&full_sem);
pthread_mutex_lock(&mutex); out = out % M;
printf("Consumer %d take product %d in position %d\n", id, buff[out], out);
buff[out] = ;
++out; pthread_mutex_unlock(&mutex);
sem_post(&empty_sem); }
} int main()
{
pthread_t id1[N1];//定义生产者线程
pthread_t id2[N2];//定义消费者线程 int i;
int ret1[N1];
int ret2[N2]; int ini1 = sem_init(&empty_sem, , M); //初始化空缓冲区 为 M(10)
int ini2 = sem_init(&full_sem, , );//初始化满缓冲区 0
if(ini1 && ini2 != )
{
printf("Sem init failed\n");
exit();
} int ini3 = pthread_mutex_init(&mutex, NULL);//初始化互斥信号量
if(ini3 != )
{
printf("mutex init failed\n");
exit();
} fp = fopen("/.data.txt", "r");//打开文件Data.txt
if(fp == NULL) exit(); for(i = ; i < N1; i++)
{
ret1[i] = pthread_create(&id1[i], NULL, product, (void*)(&i));//创建生产者线程
if(ret1[i] != )
{
printf("product%d creat failed\n", i);
exit();
}
} for(i = ; i< N2; i++)
{
ret2[i] = pthread_create(&id2[i], NULL, consume, NULL);//创建消费者线程
if(ret2[i] != )
{
printf("consumer%d creat failed\n", i);
exit();
}
} for(i = ; i < N1; i++) {pthread_join(id1[i], NULL);}
for(i = ; i < N2; i++) {pthread_join(id2[i], NULL);} exit(); }

Linux环境下实现生产者消费者问题的更多相关文章

  1. 多线程编程之Linux环境下的多线程(二)

    上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...

  2. Kafka~Linux环境下的部署

    概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据 ...

  3. linux 环境下运行STS时 出现must be available in order to run STS

    linux 环境下运行ECLIPSE时 出现 “ A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be avai ...

  4. Linux环境下部署完JDK后运行一个简单的Java程序

    前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...

  5. linux环境下学习使用pro*c/c++工具

    1.proc是oracle用来预编译嵌入SQL语句的c程序. 2.如何使用proc工具 在Linux环境下,首先确保gcc编译器正常使用,安装oracle数据库或者客户端,一般就会默认安装pro*c/ ...

  6. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  7. java 在linux环境下写入 syslog 问题研究

    1.Syslog 在Unix类操作系统上,syslog广泛应用于系统日志.syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器.接收syslog的服务器可以对多个设 ...

  8. 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解

    一.首先是下载Java JDK 到目前为止的最新版本为(jdk1.8.0_60),有两种方式进行下载: 1.使用shell来进行下载,可使用如下命令直接进行下载: wget --no-check-ce ...

  9. Linux环境下安装Tigase XMPP Server

    Tigase是一种XMPP服务器,可以作为采用XMPP协议的各种IM(Instant Messeging)工具(如Pandion.Spark等)的服务器. 在Linux环境下安装Tigase的步骤如下 ...

随机推荐

  1. iOS 一个工程中引用其他工程时要注意Skip Install选项

    当主工程引用其他工程,以便使用他们生成的库的时候,在发布时,主要注意这个选项.这个选项的说明如下 Activating this setting when deployment locations a ...

  2. dt.jar设计时rt.jar运行时

    很多人在初学Java的时候,都要配置环境变量.在配置CLASSPATH的时候,都会加上一个当前目录.,还有两个jar:dt.jar和tools.jar.其实好多人都不了解这两个jar的作用,尤其是dt ...

  3. struts2 标签问题----escape="false" 这个属性

    1.在编程过程中,会遇到这个动西,escape="false" eg: <s:fielderror escape="false"/>-------& ...

  4. Linux命令--文件管理

    1.ls ls -a 列出目录下是所有文件 ls -l 列出文件的详细信息   2.cd cd /root 进入更目录下的root文件夹 cd file 进入当前目录的file文件夹 cd .. 进入 ...

  5. php 用封装类的方法操作数据库和批量删除

    封装类 <?php class DBDA { public $host="localhost"; //服务器地址 public $uid="root"; ...

  6. zabbix_agent端 key

    root@(none):/etc/zabbix/zabbix_agentd.conf.d# grep -v "^$" /etc/zabbix/zabbix_agentd.conf| ...

  7. Zookeeper笔记(四)Zookeeper在Dubbo中的应用

    Zookeeper在Dubbo中的应用 Dubbo的架构 节点角色说明: Provider: 暴露服务的服务提供方.Consumer: 调用远程服务的服务消费方.Registry: 服务注册与发现的注 ...

  8. 在Android中将子View的坐标转换为父View的坐标

    在Android中,我们有时候可能会将子View的坐标转换为父View中的坐标.感觉很有用,分享给大家. 在Launcher中有这么一段代码可以完成这项工作.  public float getDes ...

  9. Sublime Text 插件 & 使用技巧

    20 个强大的 Sublime Text 插件http://blog.jobbole.com/58725/ 12个不可不知的Sublime Text应用技巧和诀窍http://segmentfault ...

  10. loj 1156(二分+最大流)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26870 思路:由于溢出问题,wa了半天,还以为构图错了呢,查了半天 ...