Mutex和Semaphore

Anonim

Mutex vs Semaphore

互斥锁类似于房间的单个键。持有钥匙的人,类似于线程,是唯一可以进入房间的人。然后,具有访问权限的人将不得不放弃下一个人的密钥。因此,互斥锁只能由获取它的线程释放。

互斥体通常用于序列化对可重入代码的一部分的访问“”一种不能由多个线程同时执行的代码。只允许一个线程进入一个部分。这会强制队列中的其他线程等待。在线程获得访问权限之前,它必须等到线程放弃该部分之前。

在互斥锁中使用相同的类比,信号量是可以访问具有相似锁的相同数量的房间的类似密钥的数量。信号量或信号量计数的值将取决于进入或离开房间的人(线程)的数量。如果有5个房间并且它们都被占用,那么信号量计数为零。如果两个人离开房间,则计数为2,并且两个密钥被给予队列中的下两个。

话虽如此,信号量可以由任何线程或进程同时发出信号,对于需要同步的应用程序是理想的。然而,信号量用于基于最大信号量计数有效地限制公共资源的并发用户的数量。

所以基本上,互斥锁可以被认为是值为1的信号量。

信号量的减少和增量取决于线程是否请求访问公共资源或离开该部分。

理论上,互斥和(二进制)信号量在语义上是相似的。互斥体的实现可以使用信号量来完成,反过来也是如此。但是,从实际意义上讲,它们可能会有所不同。

互斥锁旨在仅用于互斥,二进制信号量旨在用于互斥和事件通知。虽然它们在实现和一般语义方面非常相似,但它们的使用方式不同。

摘要:

1.互斥量通常用于序列化对公共资源的访问,而信号量是多个并发访问。

互斥体就像一个数量为1的信号量。 3. Mutex只允许单个线程访问,而信号量可以由任何线程或进程同时发出信号。

信号量是同步的理想选择,通常用于事件通知和互斥,而互斥锁仅用于互斥。