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的步骤如下 ...
随机推荐
- python时间转换
#设a为字符串 import time a = "2011-09-28 10:00:00" #中间过程,一般都需要将字符串转化为时间数组 time.strptime(a,'%Y-% ...
- iOS8 UILocalNotification 和 UIRemoteNotification 使用注意 草稿,正在整理中。。。。
先说一个关于UILocalNotification的知识点,容易被忘记: Each app on a device is limited to 64 scheduled local notificat ...
- mysql 我的学习
安装要求 安装环境:CentOS-6.3安装方式:源码编译安装 软件名称:mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz下载地址:http://mysql ...
- 浅谈mysql集群
一.什么是MySQL集群 MySQL集群是一个无共享的(shared-nothing).分布式节点架构的存储方案,其目的是提供容错性和高性能. 数据更新使用读已提交隔离级别(read-committe ...
- Javascript配合jQuery实现流畅的前端验证
做前端时一般都习惯用JavaScript进行表单的简单验证比如非空验证和正则表达式验证,这样过滤后的数据提交到服务端再由专门的控制器做数据处理,这样能减轻服务器的负担,下面看一下前端验证的简单步骤: ...
- Java for LeetCode 034 Search for a Range
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- 多源最短路(codevs 1077)
题目描述 Description 已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离. 现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最 ...
- C/C++函数参数读取顺序
#include <iostream> #include <stdio.h> using namespace std; void B(int a, int b){ cout & ...
- Cocos2dx实现象棋之布局
开始界面 #ifndef SCENESTART_H #define SCENESTART_H #include "cocos2d.h" #include "SceneGa ...
- wp8 入门到精通 抓包
抓包工具Fiddler的使用 Fiddler是一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据.我们可以利用它来检测网页和服务器的交互情况.下面,我们以http://bl ...