1

Я работаю над семафорами в Linux. Я хотел бы знать, может ли значение семафора быть увеличено за пределы инициализированного значения? Если да, когда это может произойти?Значение семафора больше, чем инициализированное значение

Например, значение семафора инициализируются 1. Если я увеличиваю дважды непрерывно используя вверх (СЭМ), будет значение семафора приращения за 1

x(void){ 
sema_init(sem1, 1); 
down(sem1); 
{ 
    . 
    . // some code implementation 
    . 
} 
up(sem1); // i understand this increment the value back to 1. 
up(sem1); 
/* what exactly does this statement do to the semaphore? 
Will it increment the value to 2? If so what is the meaning of this statement? */ 

}

ответ

2

Да будет увеличьте его до 2. Эффект заключается в том, что следующие два семафорных вызовов будут выполняться без блокировки. Общий вариант использования семафоров - это защита пула ресурсов. Если есть 1 ресурс, максимальное ожидаемое значение семафора будет равно 1. Если есть 2 ресурса, максимальное ожидаемое значение равно 2 и так далее. Таким образом, правильное или нецелевое увеличение семафора до 2 зависит от контекста. Если только один процесс должен пройти через семафор в любой момент времени, то приращение на 2 является ошибкой в ​​коде. Если разрешено 2 или более процесса, допускается увеличение до 2.

Это упрощенное объяснение. Для более подробной информации смотрите «подсчет семафоров». Другим типом семафора, о котором вы можете думать, являются «двоичные семафоры», которые либо 0, либо 1.