pthreads mutex vs semaphore

cpp*_*dev 70 c linux synchronization mutex pthreads

pthread库提供的信号量和互斥量有什么区别?

Has*_*yed 76

信号量有一个同步计数器,而互斥锁只是二进制(真/假).

信号量通常用作确定资源使用元素数量的权威机制 - 例如,表示n个工作线程的对象可能使用信号量来计算可用的工作线程数.

事实是,您可以通过由互斥锁同步的INT表示信号量.

  • 一个显着的区别(因为我之前看到人们犯了这个错误):信号量可能被任何序列中的任何线程获得并腾出(只要计数从不为负),但互斥量可能**仅**由锁定它的线程解锁.尝试解锁由另一个线程锁定的互斥锁是未定义的行为. (149认同)
  • 我认为这个答案仍然错过了信号量和互斥量之间的一个非常重要的区别; 这是用法.信号量是他们心中的信号机制; 他们可以通过任何线程递增和递减的事实只是这样的结果.信号量用于向其他与同步相关的控制流信号发送信号(如完全/空缓冲区).另一方面,互斥锁始终用于保护对共享对象的多个访问.这是一个很大的不同,人们总是似乎总是想念它,或者我永远不会理解他们想说的话.:P (17认同)
  • @ephemient:由于你指定的原因,答案中的最后一个断言是假的:你不能通过由互斥锁同步的INT表示信号量,因为如果保持互斥锁,你不能从另一个增加/减少int线程,你必须等待锁定线程释放互斥锁.基石的区别在于互斥锁是拥有的,而信号量不是拥有的.并且通过强制同步将所有权传输到INT.因此,您获得了一些混合的,拥有的信号量,介于无主信号量和拥有的互斥量之间. (9认同)
  • 请参阅http://www.opengroup.org/onlinepubs/009695399/functions/sem_wait.html和http://www.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html. (5认同)
  • @ephemient,这本来是一个很好的答案,非常有见地 (5认同)
  • 将计数器设置为1(无论代表什么值),信号量变为互斥量 (3认同)

小智 18

我将谈论Mutex与Binary-Semaphore.显然,您使用互斥锁来防止另一个线程同时访问一个线程中的数据.

(假设您刚刚调用了lock()并且在访问数据的过程中.这意味着,您不希望任何其他线程(或相同线程代码的另一个实例)访问由相同的互斥锁.也就是说,如果在不同的线程实例上执行相同的线程代码,则命中锁,然后lock()应该阻止控制流.)

这适用于使用不同线程代码的线程,该线程代码也访问相同的数据,并且也被同一个互斥锁锁定.

在这种情况下,您仍然在访问数据,并且您可能需要另外15秒来达到互斥锁解锁(以便在互斥锁中被阻止的另一个线程将解锁并允许控制访问数据).

你是否曾允许另一个线程解锁相同的互斥锁,反过来,允许已经在互斥锁中等待(阻塞)的线程解除阻塞并访问数据?(希望你能得到我在这里说的话.)

根据商定的普遍定义,

  • 用"互斥"这种情况不可能发生.没有其他线程可以解锁线程中的锁
  • 使用"二进制信号量"可能会发生这种情况.任何其他线程都可以解锁线程中的锁

所以,如果你非常特别使用二进制信号量而不是互斥量,那么你应该非常小心地"锁定"锁定和解锁,我的意思是,每次锁定的每个控制流都应该打一个解锁调用.不应该有任何"第一次解锁",而应该始终是"第一次锁定".


Ank*_*kur 9

厕所示例

互斥体:

是厕所的钥匙。一个人可以拥有钥匙——占用厕所——当时。完成后,此人将钥匙交给(释放)队列中的下一个人。

“互斥锁通常用于序列化对不能由多个线程同时执行的可重入代码部分的访问。互斥锁对象只允许一个线程进入受控部分,迫使其他线程尝试访问该部分等到第一个线程从该部分退出。”

(互斥锁实际上是一个值为 1 的信号量。)

信号:

是免费的相同厕所钥匙的数量。例如,假设我们有四个带有相同锁和钥匙的马桶。信号量计数 - 钥匙的数量 - 开始时设置为 4(所有四个厕所都是免费的),然后随着人们进来,计数值递减。如果所有厕所都满了,即。没有剩余的空闲键,信号量计数为 0。现在,当 eq。一个人离开厕所,信号量增加到1(一个空闲键),并给队列中的下一个人。

“信号量将共享资源的同时用户数量限制为最大数量。线程可以请求访问资源(递减信号量),并可以发出信号表示它们已完成使用资源(递增信号量)。”

来源


C L*_*ner 7

mutex用于避免多个线程之间的竞争条件.

而信号量用作跨多个过程使用的同步元素.

mutex不能用二进制信号量替换,因为一个进程等待信号量而其他进程释放信号量.如果mutex的获取和释放都由同一个处理.