![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
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; Прочитано: 199 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!