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的步骤如下 ...
随机推荐
- Android 中的AsyncTask
在后台下载图片,下载完成后更新UI是一个很常见的需求.在没有AsyncTask类之前,我们需要写许多thread和Handler的代码去实现这个功能,有了AsyncTask,一切变得简单了.下面摘抄谷 ...
- iOS 查看系统字体效果的网页
常常需要查看字体的样式,这里推荐一个网页http://iosfonts.com,方便查阅.
- Java for LeetCode 062 Unique Paths
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
- codeforces B. Permutation 解题报告
题目链接:http://codeforces.com/problemset/problem/359/B 题目意思:给定n和k的值,需要构造一条长度为2n(每个元素取值范围只能是[1,2n])且元素各不 ...
- ORACLE恢复删除的数据
---正在执行的 select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT from v$session a, v$sqlarea b where a. ...
- [Android Pro] PackageManager#getPackageSizeInfo (hide)
referce to : http://www.baidufe.com/item/8786bc2e95a042320bef.html 计算Android App所占用d的手机内存(RAM)大小.App ...
- hadoop之快照
在hadoop第前几个版本中是没有快照功能的,2.x中是有这个特性的 Hadoop 2.x HDFS新特性 HDFS快照 HDFS快照 在2.x终于实现了快照 设置一个目录为可快照 ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(3) 前后台打通
4.2.1.2.4 PipelineDraweeControllerBuilder.obtainController()源码分析 续 上节中我们提到两个核心的步骤 obtainDataSourceSu ...
- Windows下进程间通信及数据共享
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成. 多进程/多线程是Windows操作系统的一个基本特征.Microsoft W ...
- linux su和sudo命令的区别(转)
一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用 ...