Есть две причины, по которым вы можете использовать завершение вместо семафора. Во-первых, несколько потоков могут ожидать завершения, и все они могут быть освобождены одним вызовом complete_all()
. Сложнее заставить семафор разбудить неизвестное количество потоков.
Во-вторых, если ожидающий поток собирается освободить объект синхронизации, при использовании семафоров возникает условие гонки. То есть официант может проснуться и освободить объект до того, как завершится бодрствующий поток с up()
. Эта раса не существует для доработок. (См. Сообщение Лассе.)