实验四-同步与互斥-Linux实验报告_第1页
实验四-同步与互斥-Linux实验报告_第2页
实验四-同步与互斥-Linux实验报告_第3页
实验四-同步与互斥-Linux实验报告_第4页
实验四-同步与互斥-Linux实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验四实验四 同步与互斥同步与互斥 实验目的和要求 1 掌握进程 线程 的同步与互斥 2 掌握生产者消费者问题的实现方法 3 掌握多线程编程方法 实验内容 实现生产者消费者问题 1 有一个仓库 生产者负责生产产品 并放入仓库 消费者会从仓库中拿走产 品 消费 2 仓库中每次只能入一个 生产者或消费者 3 仓库中可存放产品的数量最多 10 个 当仓库放满时 生产者不能再放入产品 4 当仓库空时 消费者不能从中取出产品 5 生产 消费速度不同 实验原理 1 信号量 mutex 提供对缓冲池访问的互斥要求并初始化为 1 信号量 empty 和 full 分别用来表示空缓冲项和满缓冲项的个数 信号量 empty 初始化为 n 信号量 full 初始化为 0 2 定义如下结构及数据 定义缓冲区内的数据类型 typedef int buffer item 缓冲区 buffer item buffer BUFFER SIZE 对缓冲区操作的变量 int in out 信号量 mutex 提供了对缓冲池访问的互斥要求 pthread mutex t mutex 信号量 empty 和 full 分别表示空缓冲顶和满缓冲顶的个数 sem t empty full 可以设定生产者的生产速度及消费者的消费速度 int pro speed con speed 对缓冲区操作的自增函数 define inc k if k BUFFER SIZE k k 1 else k 0 3 并定义了如下实现问题的函数模块 将生产的产品放入缓冲区 int insert item buffer item item 从缓冲区内移走一个产品 int remove item buffer item item 生产者进程 void producer void param 消费者进程 void consumer void param 生产者结构进程 消费者结构进程 程序代码 sx c include include include include include define inc k if k BUFFER SIZE k k 1 else k 0 define BUFFER SIZE 10 缓冲区的大小 typedef int buffer item 定义缓冲区内的数据类型 buffer item buffer BUFFER SIZE 缓冲区 int in out 对缓冲区操作的变量 pthread mutex t mutex 信号量 mutex 提供了对缓冲池访问的互斥要求 sem t empty full 信号量 empty 和 full 分别表示空缓冲顶和满缓冲顶的个数 int pro speed con speed 可以设定生产者的生产速度及消费者的消费速度 int insert item buffer item item 将生产的产品放入缓冲区 buffer in item printf insert 缓冲池第 d 号 n in inc in int remove item buffer item item 从缓冲区内移走一个产品 item buffer out printf remove 缓冲池第 d 号 n out inc out void producer void param 生产者进程 buffer item item int num 0 while 1 sleep rand 16 pro speed printf n 第 d 次生产 n num printf 等待 empty 信号 n sem wait printf 等待解锁 n pthread mutex lock printf 上锁 准备生产 n item rand 1000 1 printf 生产产品 d n item insert item item printf 解锁 n printf 第 d 次生产结束 n n num pthread mutex unlock sem post void consumer void param 消费者进程 buffer item item int num 0 while 1 sleep rand 16 con speed printf n 第 d 次消费 n num printf 等待 full 信号 n sem wait printf 等待解锁 n pthread mutex lock printf 上锁 准备消费 n remove item pthread mutex unlock sem post printf 消费产品 d n item printf 解锁 n printf 第 d 次消费结束 n n num int main 主函数 pthread t tid1 tid2 pthread attr t attr1 attr2 srand time NULL pthread mutex init 初始化 sem init sem init in 0 out 0 printf n printf 开始 n printf n printf 生产者速度 1 15 n scanf d printf 消费者速度 1 15 n scanf d pthread attr init pthread create pthread attr init pthread create sleep 100 printf 程序 over n return 0 实验步骤 编写程序代码 gedit sx c 再对代码进行编译 gcc sx c o sx lpthread 编译无 错误 进行运行 sx 根据提示要求进行填写生产者和消费速度 观察消费者和 生产者进程 实验结果 实验体会 1 Linux 中生成线程方法 第一种方式是用 pthread 库来实现的 是在用户程序本身中实现线程 这 实际上是对线程的一种模拟 线程之间的切换和调度是在用户的进程内部进行 的 这种方式就被称为用户空间的线程 这种线程的好处是实现非常简单 性能也非常好 因为线程之间的切换都 在用户进程内部进行 切换开销比较小 缺点也非常明显 首先就是不能充分 利用高端系统的 SMP 多处理器的优点 因为一个进程只能由一个处理器处理 第二点由于用户空间是在用户空间切换 某个线程遇到一个需要阻塞的系统调 用进而就会造成这个进程被阻塞 因而所有线程被阻塞 第二种方式是通过修改进程的实现方式来完成 可以使用不完全的进程创 建方式创建共享数据空间的进程 在 Linux 下这种系统调用为 clone 2 Ptrtead 生成线程 POSIX thread 简称为 pthread Posix 线程是 POSIX 标准线程该标准定义内部 API 创建和操纵线程 数据类型 pthread t 线程句柄 pthread attr t 线程属性 线程操纵函数 省略参数 pthread create 创建一个线程 pthread exit 终止当前线程 pthread cancel 中断另外一个线程的运行 pthread join 阻塞当前的线程 直到另外一个线程运行结束 pthread attr ini

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论