Вы правы в том, что если код для операций с семафорами такой же, как приведенный выше, то существует риск того, что может произойти что-то плохое, если поток будет прерван в середине реализации операции.Причина того, что на практике это не является проблемой, состоит в том, что фактические реализации семафорных операций немного более сложны, чем то, что вы дали.
Некоторые реализации семафоров, например, начнутся с физического отключения прерывания.механизм на машине, чтобы гарантировать, что текущий поток не может быть прерван во время выполнения операции.Другие расположены поверх других примитивов синхронизации, которые используют аналогичные методы для предотвращения вытеснения.Другие могут использовать другие механизмы, кроме отключения прерываний, которые имеют тот же эффект, что обеспечение того, что процесс не может быть остановлен на полпути в процессе выполнения необходимой синхронизации, или, по крайней мере, обеспечение того, чтобы любые места, где может происходить вытеснение, были хорошо отмечены иправильно продумано.
Надеюсь, это поможет!