Почему семафоры должны быть атомными?
Я изучаю семафоры: sem_wait и sem_signal. Ресурсы говорят, что семафоры должны быть атомарными для реализации взаимного исключения. Я не могу понять, почему они должны быть атомарными?! что будет, если их нет?!
1 ответ
Это то, что происходит, если взаимная реализация семафора не является атомарной. Допустим, мы используем этот код для реализации семафора:
1 while (semaphore == locked) {
2 pause;
3 }
4 semaphore = locked;
Скажем, процессор 0 и процессор 1 хотят заблокировать семафор, а какой-то другой процессор (#2) имеет семафор. Таким образом, оба процессора 0 и 1 находятся в цикле while, начиная со строки 1.
Как только другой процессор (#2) разблокирует семафор, оба процессора (#0 и #1) могут выйти из своих соответствующих циклов while, потому что семафор теперь разблокирован.
Теперь оба процессора 0 и 1 думают, что они заблокировали семафор. Это плохо.
Что должно произойти, так это то, что чтение значения семафора и запись должны быть атомарными по отношению к другим процессорам.
Пожалуйста, прокомментируйте, если это не ясно - я могу вдаваться в подробности, если это необходимо.