"Если критическая область заблокирована, ожидание вызова обычно приводит к остановке процесса до тех пор, пока семафор не пропустится (то есть до тех пор, пока другой процесс не выдаст сигнал). Однако существуют также реализации семафора.у которого есть второй логический параметр, называемый «блокирование», при вызове метода ожидания.
Если для параметра блокировки задано значение «ложь», то вызов ожидания не блокируется - вызывающий процесс получает вместо возвратаvalue.
Это возвращаемое значение - «ложь», если семафор в настоящее время не может быть передан, в противном случае - «истина». Получите процесс, возвращающее значение «истина», он прошел семафор, поэтому ожидание выполнено. "
Я написал код, но я действительно не уверен, как реализовать его «блокирующую» часть.Особенно, как дать процессу возвращаемое значение.Некоторая помощь в этом была бы очень признательна.
Код в псевдокоде C-ish.
struct semaphore {
int value;
list waiting_processes;
boolean lock;
}
wait(semaphore s, boolean blocking):
while (TestAndSet(s.lock))
{noop;}
s.value = s.value - 1;
if (s.value < 0 && blocking == TRUE) {
s.waiting_processes.add(get_pid());
s.lock = FALSE;
block();
}
else {
s.lock = FALSE;
}