Почему семафоры должны быть атомными?

Я изучаю семафоры: 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 думают, что они заблокировали семафор. Это плохо.

Что должно произойти, так это то, что чтение значения семафора и запись должны быть атомарными по отношению к другим процессорам.

Пожалуйста, прокомментируйте, если это не ясно - я могу вдаваться в подробности, если это необходимо.

Другие вопросы по тегам