实验六 生产者/消费者问题实验

一、实验目的

掌握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语言实现相关推荐

  1. 实现一个通用的生产者消费者队列(c语言版本)

    背景:笔者之前一直从事嵌入式音视频相关的开发工作,对于音视频的数据的处理,生产者消费者队列必不可少,而如何实现一个高效稳定的生产者消费者队列则十分重要,不过按照笔者从业的经验,所看到的现象,不容乐观, ...

  2. Linux下生产者消费者问题的C语言实现

    注:查看全文请关注作者,或点击前往:生产者-消费者问题的C语言实现 实验六 生产者-消费者问题实现 实验题目 要求 在Linux操作系统下用C实现经典同步问题:生产者-消费者,具体要求如下: (1) ...

  3. 生产者消费者操作系统实验报告用C语言来实现

    #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h& ...

  4. C语言生产者消费者实验报告,生产者与消费者实验报告.doc

    生产者与消费者实验报告.doc 生产者和消费者实验报告[实验目的]1. 加深对进程概念的理解,明确进程和程序的区别.2. 进一步认识并发执行的实质.3. 验证用信号量机制实现进程互斥的方法.4. 验证 ...

  5. C语言实战——生产者消费者问题

    C语言实战--生产者消费者问题 方法摘要 生产者消费者共享缓冲区,生产者向缓冲区中放数据,消费者从缓冲取中取数据,当缓冲区中被放满时,生产者进程就必须进入挂起状态,直到消费者从缓冲中取走数据时,生产者 ...

  6. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  7. 在Linux系统下生产者消费者,生产者-消费者问题实现 (linux下C语言)

    操作系统的一个经典问题是"生产者-消费者"问题, 这涉及同步信号量和互斥信号量的应用, 在这里,我用线程的同步和互斥来实现. /* * author 张文 * 2008/06/20 ...

  8. 生产者消费者代码c语言_由生产者消费者模型引出的线程同步问题

    由生产者消费者模型引出的线程同步问题 基本生产者消费者模型: 代码示例: 数据模型: /*** Created by IntelliJ IDEA.** @Author: ZhangDong* @Dat ...

  9. java+创建metaq生产者_微服务架构【技术点4】windows下rocketMQ配置及java端生产者消费者配置-Go语言中文社区...

    参考资料 windows下配置rocketMQ 解压缩 系统环境变量配置 变量名:ROCKETMQ_HOME 变量值:MQ解压路径MQ文件夹名 启动NAMESERVER Cmd命令框执行进入至'MQ文 ...

最新文章

  1. AI一分钟 | 马斯克证实:特斯拉私有化的幕后推手是沙特主权基金;DeepMind的AI可以检测出超过50种眼疾...
  2. Qt 第二章 创建对话框--纯代码实现改变形状的对话框(二)
  3. Win10系列:JavaScript综合实例2
  4. 解决msgfmt无法使用的问题
  5. 苹果手机怎样用计算机,苹果手机怎么连接电脑,详细教您怎么使用苹果手机连接电脑...
  6. 广东计算机好的2a学校,广东专插本2A院校排名情况
  7. CSS3 选择器——属性选择器
  8. 在线运行 Linux,强的离谱!
  9. 为什么赚不到90后00后的钱?
  10. 领导秘书,一般都是什么样的人?
  11. 大众点评文字反爬破解
  12. hive查询数据库总条数
  13. uiautomatorviewer 双击闪退问题
  14. System.setOut(ps)重定义了输出流后,如何重定向控制台输出
  15. 使用Adobe illustrator (AI)快速制作图标
  16. 爬虫实战5:豆瓣读书爬取
  17. 人脸和身份证不匹配_人脸识别身份信息不匹配是什么意思
  18. 打印机不打印计算机原因,打印机打印不完整?是这10个原因造成的!打印必备...
  19. 论文笔记(精读文章) - Invisible Backdoor Attack with Sample-Specific Triggers
  20. 栈的应用 - 波兰式与逆波兰式

热门文章

  1. 在rviz中画轨迹,使用rosbag抓取,并回放
  2. K8S 部署Prometheus
  3. IE已经阻止此站点以不安全的方式使用ActiveX控件的解决
  4. lammps案例分析(1):石墨烯单轴拉伸之velocity方式
  5. 16亿乐透大奖有独主,也有人输(哭)的响亮
  6. A4988/DRV8825步进电机驱动拓展板(HW-434)资料
  7. JS之FormData对象
  8. FormData对象用法
  9. 激光雷达和相机联合标定之cam_lidar_calibration
  10. (20210129已解决)Pandas通过某列值包含特定字符串过滤行