Linux环境下实现生产者消费者问题
#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环境下实现生产者消费者问题的更多相关文章
- 多线程编程之Linux环境下的多线程(二)
上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...
- Kafka~Linux环境下的部署
概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据 ...
- 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 ...
- Linux环境下部署完JDK后运行一个简单的Java程序
前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...
- linux环境下学习使用pro*c/c++工具
1.proc是oracle用来预编译嵌入SQL语句的c程序. 2.如何使用proc工具 在Linux环境下,首先确保gcc编译器正常使用,安装oracle数据库或者客户端,一般就会默认安装pro*c/ ...
- Linux环境下段错误的产生原因及调试方法小结(转)
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
- java 在linux环境下写入 syslog 问题研究
1.Syslog 在Unix类操作系统上,syslog广泛应用于系统日志.syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器.接收syslog的服务器可以对多个设 ...
- 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解
一.首先是下载Java JDK 到目前为止的最新版本为(jdk1.8.0_60),有两种方式进行下载: 1.使用shell来进行下载,可使用如下命令直接进行下载: wget --no-check-ce ...
- Linux环境下安装Tigase XMPP Server
Tigase是一种XMPP服务器,可以作为采用XMPP协议的各种IM(Instant Messeging)工具(如Pandion.Spark等)的服务器. 在Linux环境下安装Tigase的步骤如下 ...
随机推荐
- DP:Sumsets(POJ 2229)
数的集合问题 题目大意:给定你一个整数m,你只能用2的k次幂来组合这个数,问你有多少种组合方式? 这一题一看,天啦太简单了,完全背包?是不是? 不过的确这一题可以用完全背包来想,但是交题绝对是TLE ...
- 奇怪的梦境(codevs 2833)
题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息.屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明 ...
- 《Algorithms算法》笔记:优先队列(2)——二叉堆
二叉堆 1 二叉堆的定义 堆是一个完全二叉树结构(除了最底下一层,其他层全是完全平衡的),如果每个结点都大于它的两个孩子,那么这个堆是有序的. 二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组 ...
- 【读书笔记】读《JavaScript模式》 - JavaScript函数常用模式
API模式:回调模式.配置对象.返回函数: 初始化模式:即时函数.即时对象初始化.初始化分支: 性能模式:备忘模式.自定义模式 //*********************** API模式 **** ...
- unix/linux进程详解——代码
#include <iostream>#include <vector>#include <cstdint>#include <cstring>#inc ...
- Nginx(PHP/fastcgi)的PATH_INFO问题
引用: http://www.laruence.com/2009/11/13/1138.html server { listen 80; server_name localhost; index in ...
- .NET Framework 4.6的新东西
我们知道.NET Framework 4.6即将随着Visual Studio 2015一同到来,目前依然是预览版.4.6和4,4.5,4.5.1和4.5.2是兼容的,也即安装4.6后会升级替代他们. ...
- matlab练习程序(多边形顶点凹凸性)
生成简单多边形后,有时还需要对多边形各顶点的凹凸性做判断. 先计算待处理点与相邻点的两个向量,再计算两向量的叉乘,根据求得结果的正负可以判断凹凸性. 结果为负则为凹顶点,为正则为凸顶点. 凹顶点用o表 ...
- node Later定时任务
var later = require('later'); later.date.localTime(); var basic = {h: [15], m: [40], s: [0]}; var co ...
- cocos2dx游戏开发——捕鱼达人mini版学习笔记(一)——FishAchor的搭建
一.创建文件· FishAchor.h还有FishAchor.cpp. 主要就是创建每种鱼的类,方便以后的取用~,很多是重复性的操作,然后我们是mini版,暂时也就加入大概6钟鱼就好= =,然后我们现 ...