Linux多线程编程(三)---线程之间的同步与互斥进阶实验
来源:互联网 发布:wumpus java 游戏编码 编辑:程序博客网 时间:2024/06/14 21:14
实验目的
通过编写经典的“生产者-消费者”问题的实验,进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。
实验内容
“生产者--消费者”问题描述如下:
有一个有限缓冲区(这里用有名管道实现FIFO式缓冲区)和两个线程:生产者和消费者,它们不停地把产品放入缓冲区和从缓冲区拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥执行。它们之间的关系如下图1所示:
这里要求使用有名管道来模拟有限缓冲区,并且使用信号量来解决“生产者---消费者”问题中的同步和互斥问题。
实验步骤
(1) 信号量的考虑。这里使用3个信号量,其中两个信号量avail和full分别用于解决生产者和消费者之间的同步问题,mutex用于解决这两个线程之间的互斥问题。其中,avail表示有界缓冲区中的空单元数,初始值为N;full表示有界缓冲区中的非空单元数,初始值为0;mutex是互斥信号量,初始值为1。
(2) 流程图如下:
(3) 编写代码。本实验的代码中采用的有界缓冲区拥有3个单元,每个单元为5字节。为了尽量体现每个信号量的意义,在程序中生产过程和消费过程是随机(采取0~5s的随机时间间隔)进行的,而且生产者的速度比比消费者的速度平均快两倍左右(这种关系可以相反)。生产者一次生产一个单元的产品(放入“hello”字符串),消费者一次消费一个单元的产品。
实验代码如下:producer-customer.c文件,如有需要,点此下载
实验结果
编译:gcc producer-customer.c -o producer-customer -lpthread
执行: sudo ./producer-customer,注意这里要以root权限执行
结果:
如果不注释掉142行代码,看看结果是什么。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/mybelief321/article/details/9395799
- Linux多线程编程(三)---线程之间的同步与互斥进阶实验
- Linux多线程编程(三)---线程之间的同步与互斥进阶实验
- Linux多线程编程(二)---线程之间的同步与互斥
- Linux多线程编程(二)---线程之间的同步与互斥
- [Linux C编程]线程之间的同步与互斥
- 多线程编程—线程的同步与互斥
- Linux下的多线程编程二(线程的同步与互斥)
- linux 多线程编程 同步与互斥
- linux多线程编程 同步与互斥
- Linux多线程编程--同步与互斥
- Linux多线程编程--同步与互斥
- Linux多线程编程--同步与互斥
- 线程面试题之三:父子线程和子线程之间的同步与互斥
- 三线程的互斥与同步
- 多线程编程 线程互斥 线程同步
- linux多线程的互斥与同步
- Linux多线程的同步与互斥
- Linux多线程的同步与互斥
- 为什么JDK中String类的indexof不使用KMP或者Boyer-Moore等时间复杂度低的算法编辑器
- 黑马程序员——C语言基础学习(一)---C语言中的基本概念总结
- Linux多线程编程(二)---线程之间的同步与互斥
- 基于Processing的人物八方向移动演示:X,Y,XY同时到达移动
- MaterialCheckBox
- Linux多线程编程(三)---线程之间的同步与互斥进阶实验
- Subversion 1.8.13+Apache2.4.6安装
- java的线程同步
- 获取iOS设备信息
- Section 10 Statics, Running Order and Access Level
- 深入 Java 调试体系,第 2 部分: JVMTI 和 Agent 实现
- 深入 Java 调试体系,第 3 部分: JDWP 协议及实现
- 深入 Java 调试体系,第 4 部分: Java 调试接口(JDI)
- 在rials 中使用bootstrap 的modal对话框 实现一个弹窗显示多层次内容的方法