[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Алгоритм Деккера (1968).
int turn;
boolean flag[2 ];
proc( int i )
{
while (TRUE)
{
<вычисления>;
enter_region( i );
<критический интервал>;
leave_region( i );
}
}
void enter_region( int i )
{
try: flag[i] = TRUE;
while (flag [(i + 1) % 2])
{
if ( turn == i ) continue;
flag[ i ] = FALSE;
while ( turn != i );
goto try;
}
}
void leave_region( int i )
{
turn = ( turn +1 ) % 2;
flag[ i ] = FALSE;
}
turn = 0;
flag[ 0 ] = FALSE;
flag[ 1 ] = FALSE;
proc( 0 ) AND proc( 1 ) /* запустили 2 процесса */
--------------------------------------------------------------------------------
Алгоритм Петерсона (1981)
int turn;
int flag[ 2 ];
void enter_region( int i )
{
int other; /* номер другого процесса */
other = 1 - i;
flag[ i ] = TRUE;
turn = i;
while (turn == i && flag[ other ] == TRUE) /* пустой оператор */;
}
void leave_region( int i )
{
flag[ i ] = FALSE;
}
E-mail: info@telesys.ru