生产者消费者问题的C语言实现
实验六 生产者/消费者问题实验
一、实验目的
掌握Linux下生产者/消费者问题算法的实现
二、实验原理
1.clone系统调用:
功能:创建一个轻进程或线程
用法:
intclone (int (*fn)(void *arg),void *stack,int flag,void *arg);
其中,
★fn是轻进程所执行的函数;stack是轻进程所使用的栈
★flag是CLONE_VM,CLONE_FS,CLONE_FILES,CLONE_SIGNAND,CLONE_PID的组合
★arg是调用过程的对应参数
clone的关键是flag的设定。
☆CLONE_VM表示子进程共享父进程的内存
☆CLONE_FS表示子进程共享父进程的文件系统
☆CLONE_SIGNAND表示子进程共享父进程的消息处理机制
☆CLONE_PID指子进程继承父进程的id号
2.sem_wait和sem_post系统调用:
sem_wait(&s)和sem_post(&s)分别相当于信号灯的P操作和V操作。其中,s是类型为sem_t的信号灯。初始化函数sem_init(s,0,8)。
3.pthread_mutex_lock和pthread_mutex_unlock系统调用:
pthread_mutex_lock(&mutex)和pthread_rmutex_unlock(&mutex)分别用于加锁和解锁。参数为mutex定义的互斥锁。初始pthread_mutex_init(&mutex,NULL)。
三、实验内容
1. 阅读以下源码,使用系统调用clone()创建两个生产者线程和两个消费者线程。当该程序运行时,在系统中有两个生产者线程和两个消费者线程并发执行。观察至少三次以上的运行结果并分析原因;(编译命令:gcc –pthread -o pc.out producerconsumer.c)
#include "sched.h"
#include "pthread.h"
#include "stdio.h"
#include "stdlib.h"
#include "semaphore.h"
#define BUFFER_LEN 8 //定义缓冲区长度
void producer(void *args);
void consumer(void *args);
pthread_mutex_t mutex;
sem_t product;
sem_t warehouse;
char buffer[BUFFER_LEN][4];
int in,out; //产品进、出缓冲区指针
int tot=0; //缓冲区中的产品总数
main(int argc,char **argv){
pthread_mutex_init(&mutex,NULL); //对互斥信号量进行初始化
sem_init(&product,0,0); //对标识产品个数的信号量进行初始化
sem_init(&warehouse,0,BUFFER_LEN); //对标识缓冲区中空位置个数的信号量进行初始化
in=0;
out=0;
inti0=0,i1=1;
intclone_flag, retval;
char *stack;
clone_flag=CLONE_VM|CLONE_SIGHAND|CLONE_FS|CLONE_FILES;
//创建两个生产者和两个消费者线程
stack=(char *)malloc(4096);
retval=clone((void *)producer,&(stack[4095]),clone_flag,(void*)&i0);
stack=(char *)malloc(4096);
retval=clone((void *)consumer,&(stack[4095]),clone_flag,(void*)&i0);
stack=(char *)malloc(4096);
retval=clone((void *)producer,&(stack[4095]),clone_flag,(void*)&i1);
stack=(char *)malloc(4096);
retval=clone((void *)consumer,&(stack[4095]),clone_flag,(void*)&i1);
exit(1);
}
void producer(void *args){
intid=*((int *)args);
inti;
for(i=0;i<10;i++){
sleep(i+1);
sem_wait(&warehouse);
pthread_mutex_lock(&mutex);
if(id==0)
strcpy(buffer[in],"aaa\0");
else
strcpy(buffer[in],"bbb\0");
printf("producer %d produces %s in %d\n",id,buffer[in],in);
in=(in+1)%BUFFER_LEN;
tot++; //当前产品总数加1
printf("*****the number of products:%d*****\n",tot);
pthread_mutex_unlock(&mutex);
sem_post(&product);
}
printf("producer %d is over!\n",id);
}
void consumer(void *args){
intid=*((int *)args);
inti;
for(i=0;i<10;i++){
sleep(10-i);
sem_wait(&product);
pthread_mutex_lock(&mutex);
printf("consumer %d get %s in %d\n",id,buffer[out],out);
out=(out+1)%BUFFER_LEN;
tot--; //当前产品总数减1
printf("*****the number of products:%d*****\n",tot);
pthread_mutex_unlock(&mutex);
sem_post(&warehouse);
}
printf("consumer %d is over!\n",id);
}
2. 修改上述代码,将producer函数中的sem_wait(&warehouse)和pthread_mutex_lock(&mutex)两行交换。观察至少三次以上的运行结果并分析原因;
3. 修改上述代码,将producer函数中的sem_wait(&warehouse)和pthread_mutex_lock(&mutex)两行交换,并且创建两个生产者线程和一个消费者线程。观察至少三次以上的运行结果并分析原因。
(注意:用linux中用ctrl+z返回到输入命令行方式)
四、实验要求
请同学们参考给出代码完成本次实验。
该实验为操作型实验,其实验报告书写要求如下:
n 实验原理:阐述系统调用的用法。
n 实验方案设计:利用clone系统调用实现线程创建、利用sem_wait和sem_post系统调用完成PV操作、利用pthread_mutex_lock和pthread_mutex_unlock实现进程互斥。
n 实验过程应包括:为给出的源程序加上注释
n 实验结论应包括:程序运行结果,粘贴上拷屏的图(注意:为jpg格式)
n 小结应包括:三段程序运行结果及原因分析、实验的体会及收获、对搞好今后实验提出的建设性建议。
提交内容:实验报告
生产者消费者问题的C语言实现相关推荐
- 实现一个通用的生产者消费者队列(c语言版本)
背景:笔者之前一直从事嵌入式音视频相关的开发工作,对于音视频的数据的处理,生产者消费者队列必不可少,而如何实现一个高效稳定的生产者消费者队列则十分重要,不过按照笔者从业的经验,所看到的现象,不容乐观, ...
- Linux下生产者消费者问题的C语言实现
注:查看全文请关注作者,或点击前往:生产者-消费者问题的C语言实现 实验六 生产者-消费者问题实现 实验题目 要求 在Linux操作系统下用C实现经典同步问题:生产者-消费者,具体要求如下: (1) ...
- 生产者消费者操作系统实验报告用C语言来实现
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h& ...
- C语言生产者消费者实验报告,生产者与消费者实验报告.doc
生产者与消费者实验报告.doc 生产者和消费者实验报告[实验目的]1. 加深对进程概念的理解,明确进程和程序的区别.2. 进一步认识并发执行的实质.3. 验证用信号量机制实现进程互斥的方法.4. 验证 ...
- C语言实战——生产者消费者问题
C语言实战--生产者消费者问题 方法摘要 生产者消费者共享缓冲区,生产者向缓冲区中放数据,消费者从缓冲取中取数据,当缓冲区中被放满时,生产者进程就必须进入挂起状态,直到消费者从缓冲中取走数据时,生产者 ...
- windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现
生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...
- 在Linux系统下生产者消费者,生产者-消费者问题实现 (linux下C语言)
操作系统的一个经典问题是"生产者-消费者"问题, 这涉及同步信号量和互斥信号量的应用, 在这里,我用线程的同步和互斥来实现. /* * author 张文 * 2008/06/20 ...
- 生产者消费者代码c语言_由生产者消费者模型引出的线程同步问题
由生产者消费者模型引出的线程同步问题 基本生产者消费者模型: 代码示例: 数据模型: /*** Created by IntelliJ IDEA.** @Author: ZhangDong* @Dat ...
- java+创建metaq生产者_微服务架构【技术点4】windows下rocketMQ配置及java端生产者消费者配置-Go语言中文社区...
参考资料 windows下配置rocketMQ 解压缩 系统环境变量配置 变量名:ROCKETMQ_HOME 变量值:MQ解压路径MQ文件夹名 启动NAMESERVER Cmd命令框执行进入至'MQ文 ...
最新文章
- AI一分钟 | 马斯克证实:特斯拉私有化的幕后推手是沙特主权基金;DeepMind的AI可以检测出超过50种眼疾...
- Qt 第二章 创建对话框--纯代码实现改变形状的对话框(二)
- Win10系列:JavaScript综合实例2
- 解决msgfmt无法使用的问题
- 苹果手机怎样用计算机,苹果手机怎么连接电脑,详细教您怎么使用苹果手机连接电脑...
- 广东计算机好的2a学校,广东专插本2A院校排名情况
- CSS3 选择器——属性选择器
- 在线运行 Linux,强的离谱!
- 为什么赚不到90后00后的钱?
- 领导秘书,一般都是什么样的人?
- 大众点评文字反爬破解
- hive查询数据库总条数
- uiautomatorviewer 双击闪退问题
- System.setOut(ps)重定义了输出流后,如何重定向控制台输出
- 使用Adobe illustrator (AI)快速制作图标
- 爬虫实战5:豆瓣读书爬取
- 人脸和身份证不匹配_人脸识别身份信息不匹配是什么意思
- 打印机不打印计算机原因,打印机打印不完整?是这10个原因造成的!打印必备...
- 论文笔记(精读文章) - Invisible Backdoor Attack with Sample-Specific Triggers
- 栈的应用 - 波兰式与逆波兰式