Вы находитесь на странице: 1из 21

# 3.

: ,

3.1.
3.2.
3.2.1.
3.2.2.
3.2.2.1.
3.2.2.2.
3.2.2.3.

3.3.

,
()
.

,

.

( ),

.

.
(race conditions) .

X
Y

void echo ()
{
char in;
input ( in ) ;
output ( in ) ;
}

input(in);

output(in);

input(in);
output(in);

Y
Y

,
,
, .

()

, -

.

-
, .

B

A
4

STOP

STOP

,
. ,
.

,
.

,
Down ( S ) P ( S ) Proberen ()
Up ( S ) V ( S ) Verhogen ()

,
1.
1
int semaphore;

down ( semaphore ) ;
/*
1*/

up ( semaphore ) ;

2
int semaphore;

down ( semaphore ) ;
/*
2*/

up ( semaphore ) ;

,
.

,

(
)

:
send ( destination, message )

(ID )
( , )

1.

2.
3.

(
)

#define N 5
void philosopher ( int i )
{
while (TRUE)
{
think () ;
take_fork ( i ) ;
take_fork ( ( i + 1 ) % N ) ;
eat () ;
put_fork ( i ) ;
put_fork ( ( i + 1 ) % N ) ;
}
return;
}

#
#
#
#
#
#

define
define
define
define
define
define

N 5
LEFT ( i 1 ) % N
RIGHT ( i + 1 ) % N
THINKING 0
HUNGRY 1
EATING 2

## typedef int semaphore ;

int state [ N ] ;
semaphore mutex = 1 ;
semaphore s [ N ] ;

void philosopher ( int i )
{ while ( TRUE )
{
think () ;
take_forks ( i ) ;
eat ();
put_forks ( i ) ;
}
}
void put_forks ( int i )
{
down ( & mutex ) ;
state[i] = THINKING ;
test ( LEFT ) ;
test ( RIGHT ) ;
up ( & mutex ) ;
}

## void take_forks ( int i )

{
down ( & mutex ) ;
state [ i ] = HUNGRY ;
test ( i ) ;
up( & mutex ) ;
down ( & s [ i ] ) ;
}
void test ( int i )
{
if ( ( state [ i ] == HUNGRY )
&& ( state [ LEFT ] != EATING )
&& ( state [ RIGHT ] != EATING ))
{
state [ i ] = EATING ;
up ( & s [ i ] ) ;
}
}

( )

## typedef int semaphore ;

int rc = 0 ;
semaphore mutex = 1 ;
semaphore db = 1 ;
void writer ( void )
{
{
while ( TRUE )
while ( TRUE )
{
{
down ( & mutex ) ;
think_up_data () ;
rc++ ;
down ( & db ) ;
if ( rc == 1 ) down ( & db ) ;
write_data_base () ;
up ( & mutex ) ;
up ( & db ) ;
down ( & mutex ) ;
}
rc ;
}
if ( rc ==0 ) up ( & db ) ;
up ( & mutex ) ;
}
}

(-
)

#define CHAIRS 5
typedef int semaphore ;
semaphore customers = 0 ;

semaphore barbers = 0 ;
semaphore mutex = 1 ;
int waiting = 0 ;

## void barber ( void )

void customer ( void )
{
{
down ( & mutex ) ;
while ( TRUE )
if ( waiting < CHAIRS )
{
{
down ( & customers ) ;
waiting = waiting + 1 ;
down ( & mutex ) ;
up ( & customers ) ;
waiting = wating 1 ;
up ( & mutex ) ;
up ( & barbers ) ;
down ( barbers ) ;
up ( & mutex ) ;
get_haircut () ;
cut_hair () ;
}
else
}
{
}
up ( & mutex ) ;
}
}