Linux多线程编程(三)---线程之间的同步与互斥进阶实验

实验目的

通过编写经典的“生产者-消费者”问题的实验,进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。

实验内容

“生产者--消费者”问题描述如下:

有一个有限缓冲区(这里用有名管道实现FIFO式缓冲区)和两个线程:生产者和消费者,它们不停地把产品放入缓冲区和从缓冲区拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥执行。它们之间的关系如下图1所示:

这里要求使用有名管道来模拟有限缓冲区,并且使用信号量来解决“生产者---消费者”问题中的同步和互斥问题。

实验步骤

(1) 信号量的考虑。这里使用3个信号量,其中两个信号量avail和full分别用于解决生产者和消费者之间的同步问题,mutex用于解决这两个线程之间的互斥问题。其中,avail表示有界缓冲区中的空单元数,初始值为N;full表示有界缓冲区中的非空单元数,初始值为0;mutex是互斥信号量,初始值为1。

(2) 流程图如下:

Linux多线程编程(三)---线程之间的同步与互斥进阶实验_第1张图片

(3) 编写代码。本实验的代码中采用的有界缓冲区拥有3个单元,每个单元为5字节。为了尽量体现每个信号量的意义,在程序中生产过程和消费过程是随机(采取0~5s的随机时间间隔)进行的,而且生产者的速度比比消费者的速度平均快两倍左右(这种关系可以相反)。生产者一次生产一个单元的产品(放入“hello”字符串),消费者一次消费一个单元的产品。

实验代码如下:producer-customer.c文件,如有需要,点此下载

Linux多线程编程(三)---线程之间的同步与互斥进阶实验_第2张图片

Linux多线程编程(三)---线程之间的同步与互斥进阶实验_第3张图片

Linux多线程编程(三)---线程之间的同步与互斥进阶实验_第4张图片

Linux多线程编程(三)---线程之间的同步与互斥进阶实验_第5张图片

Linux多线程编程(三)---线程之间的同步与互斥进阶实验_第6张图片

实验结果

编译:gcc producer-customer.c -o producer-customer -lpthread

执行:sudo ./producer-customer,注意这里要以root权限执行

结果:

Linux多线程编程(三)---线程之间的同步与互斥进阶实验_第7张图片

如果不注释掉142行代码,看看结果是什么。

你可能感兴趣的:(linux)