消费者与生产者的线程之间同步操作

来源:互联网 发布:.php结尾的网页 收录 编辑:程序博客网 时间:2024/05/11 19:07

实验目的

通过编写经典的“生产者-消费者”问题的实验,进一步熟悉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权限执行

结果:
这里写图片描述

0 0