Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Whiletrue do



Begin

calculate_next_result;

P(number_retrieved);

number_buffer:= nextresult;

V(number_deposited)

End

end;

procedure consumer_process;

var next_result: integer;

Begin

Whiletrue do

Begin

P(number_deposited);

next_result:= number_buffer;

V(number_retrieved);

write(next_result)

End

end;

Begin

semaphore_initialize(number_deposited, 0);

semaphore_initialize(number_retrieved, 1);

Parbegin

producer_process;

consumer_process;

Parend

End.

В этом примере мы использовали два семафора: number_deposited и number_

retrieved. Первый семафор устанавливается (V) производителем и проверяется (P) потребителем; потребитель не может продолжать свою работу, пока не размещено число в буфере. Второй семафор устанавливается потребителем, и проверяется производителем; производитель не может продолжать свою работу, пока потребитель не считал число из буфера. Начальное значение семафоров позволяет производителю разместить результат работы в буфере, а потребитель ожидает этого.

Синхронизация процессов может быть обеспечена и без взаимного исключения. Для этого введем понятие счетчика событий и последовательности.

Счетчик событий следит за количеством появления события или определенного класса событий; это просто натуральное число, которое не уменьшается.

При создании он устанавливается на 0. Над счетчиком событий можно выполнить

три примитивных операции: advance(event_count) – для увеличения счетчика на 1

при наступлении события; read(event_count) – для получения текущего значения

счетчика; await(event_count, value) – приостановить процесс до достижения счетчиком значения, не меньше указанного.

Следующий пример показывает, как задача об отношении производитель-потребитель может быть реализована с помощью счетчиков события и кольцевым

буфером. В нашем случае будем считать, что буфер состоит из 5 элементов, от 0

до 4. Каждый его элемент содержит значение какого-то типа. Для синхронизации

процессов используются два счетчика, in и out. Произведенный элемент размещается в ячейке буфера с номером i mod n. Повторно использовать ячейку можно

только при условии, что потребитель уже считал данные из нее.

program event_count_producer_consumer;

const n = 5;

var in,out: event_count;

ring_buffer: array[0...n-1] of element_type;

procedure producer_process;

var i: integer;

Begin

i:= 0;





Дата публикования: 2015-01-26; Прочитано: 182 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...