Review: Producer and Consumer

!"

! "

#
$

#define BUFFER_SIZE 10
typedef struct {
. . .
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
int counter = 0;

#
%

&'


()
*#

)(
%

++ ,-../!0

1/&'

2 ((
3 4+
*#
5
+ % 6 7& 8 ,-../!0 1/5
##$
2

$
%


& '
%

2 ((
*$
+%
%%$
()

2

++ 9&'
+
3
45
6 7& 8 ,-../!0 1/5
*$

:


#

;
##$
%%$

:
&
<

,
#

>

=,
66?

7+

7+
+

#

>

767
7

==?
@+
@+
+

@

7

@


A

B
!!

!

C

B
<
B

B

$
>

*

+ D?

9
7

*
*

G
D

7+
7+

@
F

"

*

*

*
*

'
767'

@+

'

@+

@=7'

+
+

7 '

@ '

7 + D2
7 + E2

@ + D2
@ + G2

+E2
+ G2

!

$

!
<
H

B


$
' (

=
<
=
<

B

<
"

<

/*
;

<


;

%#
A

&

B
<

:

%,
;
:
;

I
=


*
$#-<

&

=
=

B
(

"

;
B

=

=
%

"

&

B
# %

#
)

=
( "
<

#9

#7<
#&

( (
!

:

7

J
5
+ 5
-

#9
" * "
#9
9<

((
((#
#

+9

9B

7
(

!

(
B

#7

B

( ++
B

7B

#7

:

@

J
3@45
394 +

34+

374 +

5 ((#

#9

#9
#7
<

"
;

#9

B #9

* "
(
#9 K #7

!

(

;

<

( ++
B

394 K
L

394

394
B #9
<

374

B

#

:

;
"
5
,

;

3@45

"
<

;
<

34+
#

M

:

#

#

while (true) {
flag[i] = TRUE;
turn = j;
while ( flag[j] && turn == j);
CRITICAL SECTION
flag[i] = FALSE;
REMAINDER SECTION
}
" * "
#9

!
#7

(

( ++
B #9

,
394

,

:

$
B
<
N

<
B
7B @B @B @B FB FB GB DL
'

'

"

<
3 45
3 45

9<
% B &O% B &

O

+

O

,

:

P
#

%
%

!

;

!

=:

:

B

#
%
P

;
,

=:

=

&
=

&

&

Q

:

A "

/*

!
"
#

"

/*
C
B
"

C
,

=
"
A

B

"

%7RE9&
"

A
S
T

B

!

"

;

%&
S

#%&
"

$
&

. /0
& "
$
%%$

J%&
"

12 3
%

4
O9
! ". /0
##$
4

%&

B

%

&

I

=

I

+9

DE #
DU
#
#

5
>7?
% &

7U I
7V #
7

@

@B

6
% &
>@?

I
.
,

$

A "
A " W
A " W
!

"

I

A " W

$
,
!

#
=,

#
I

=#

#
#

,

,

#
$
=
#
=

B