|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 thinkfunny 于 2019-9-23 10:15 编辑 4 H* x" W) I# L7 j- F
% t0 i+ O& i0 T0 a4 e& j0 r实验目的8 Y1 z1 d2 E y( ~' P
$ h! L M9 L$ c: t& ], _, {
通过编写经典的“生产者-消费者”问题的实验,进一步熟悉Linux中的多线程编程,并且掌握用信号量处理线程间的同步和互斥问题。
( W4 r) B: u" m) n: N) _$ g* _
+ F7 w3 A5 O' v1 ~- q I: d实验内容. u1 L3 R3 A }# W3 _
, s2 ^' c% x$ u9 h" h; V! D “生产者--消费者”问题描述如下:
8 t* t H) K; R5 u' N2 N8 V' ~8 y7 K$ y6 M; c" r2 D( ?9 Y! C# @$ A
有一个有限缓冲区(这里用有名管道实现FIFO式缓冲区)和两个线程:生产者和消费者,它们不停地把产品放入缓冲区和从缓冲区拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也必须等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥执行。它们之间的关系如下图1所示:2 F, W" o, T: S/ z8 a7 R+ R* C
$ L6 `' `1 z2 |( H
n: X: `) ]% f$ X6 o3 u$ D
1 n: c: R0 l4 ^ `( N 这里要求使用有名管道来模拟有限缓冲区,并且使用信号量来解决“生产者---消费者”问题中的同步和互斥问题。
' k) T* L' y. {: g6 d' H0 U* T" g3 L* t+ U
实验步骤: [1 [3 B# G) G
3 c( \+ i8 G. H0 \/ _0 q (1) 信号量的考虑。这里使用3个信号量,其中两个信号量avail和full分别用于解决生产者和消费者之间的同步问题,mutex用于解决这两个线程之间的互斥问题。其中,avail表示有界缓冲区中的空单元数,初始值为N;full表示有界缓冲区中的非空单元数,初始值为0;mutex是互斥信号量,初始值为1。3 D/ h6 d( v/ H+ I7 l! g2 x
- d& ~& p* m/ S6 B
(2) 流程图如下:
& P0 ]5 R) a# X j
$ m; A6 p2 s7 g. b
1 m: V/ o$ Q* ^, R$ a4 O# L8 V {" z5 E! p" p
1 R, a/ a5 d+ @( l/ W
/ ~8 D) ]* ?) L7 M. |1 M
( P0 A* K" i8 I" Z6 P
|
|