Monitor 和 Semaphore 之间的主要区别是什么?
Monitor 是一个旨在从多个线程访问的对象。监视器对象的成员函数或方法将强制互斥,因此在给定时间只有一个线程可能对对象执行任何操作。如果一个线程当前正在执行对象的成员函数,那么任何其他尝试调用该对象的成员函数的线程都必须等到第一个线程完成。
信号量 是较低级别的对象。您可能会使用信号量来实现监视器。信号量本质上只是一个计数器。当计数器为正时,如果一个线程试图获取信号量,那么它被允许,并且计数器递减。当一个线程完成时,它会释放信号量,并增加计数器。
如果当一个线程试图获取信号量时计数器已经为零,那么它必须等到另一个线程释放信号量。如果一个线程释放信号量时多个线程正在等待,那么其中一个会得到它。释放信号量的线程不必与获取信号量的线程相同。
监视器就像公共厕所。一次只能有一个人进入。他们锁上门以防止其他人进来,做他们的事情,然后在他们离开时解锁。
信号量就像一个自行车出租点。他们有一定数量的自行车。如果您尝试租用一辆自行车并且他们有免费的,那么您可以使用它,否则您必须等待。当有人归还他们的自行车时,其他人就可以拿走它。如果你有一辆自行车,那么你可以把它交给其他人归还——自行车出租店不在乎谁归还它,只要他们把自行车拿回来。