A Monitor - это объект, предназначенный для доступа из нескольких потоков. Функции-члены или методы объекта монитора будут обеспечивать взаимное исключение, поэтому только один поток может выполнять какое-либо действие над объектом в данный момент времени. Если один поток в настоящее время выполняет функцию-член объекта, то любой другой поток, который пытается вызвать функцию-член этого объекта, должен будет дождаться завершения первого.
A Семафор является объектом более низкого уровня. Вы можете использовать семафор для реализации монитора. Семафор - это просто счетчик. Когда счетчик положителен, если поток пытается получить семафор, он разрешается, и счетчик уменьшается. Когда поток завершается, он освобождает семафор и увеличивает счетчик.
Если счетчик уже равен нулю, когда поток пытается получить семафор, он должен ждать, пока другой поток не освободит семафор. Если несколько потоков ожидают, когда поток выпускает семафор, то один из них получает его. Поток, выпускающий семафор, не обязательно должен быть тем же потоком, который его получил.
Монитор похож на общественный туалет. Только один человек может войти одновременно. Они закрывают дверь, чтобы никто не мог войти, делают свои вещи, а затем отпирают, когда уходят.
Семафор походит на место проката велосипедов. У них есть определенное количество велосипедов. Если вы попробуете взять напрокат велосипед и у него будет один бесплатный, вы можете взять его, иначе вам придется подождать. Когда кто-то возвращает свой велосипед, кто-то другой может взять его. Если у вас есть велосипед, вы можете дать его кому-нибудь еще, чтобы он вернулся - пункт проката велосипедов не заботится о том, кто его вернет, если он вернет свой велосипед.