cpp*_*dev 70 c linux synchronization mutex pthreads
pthread库提供的信号量和互斥量有什么区别?
Has*_*yed 76
信号量有一个同步计数器,而互斥锁只是二进制(真/假).
信号量通常用作确定资源使用元素数量的权威机制 - 例如,表示n个工作线程的对象可能使用信号量来计算可用的工作线程数.
事实是,您可以通过由互斥锁同步的INT表示信号量.
小智 18
我将谈论Mutex与Binary-Semaphore.显然,您使用互斥锁来防止另一个线程同时访问一个线程中的数据.
(假设您刚刚调用了lock()并且在访问数据的过程中.这意味着,您不希望任何其他线程(或相同线程代码的另一个实例)访问由相同的互斥锁.也就是说,如果在不同的线程实例上执行相同的线程代码,则命中锁,然后lock()应该阻止控制流.)
这适用于使用不同线程代码的线程,该线程代码也访问相同的数据,并且也被同一个互斥锁锁定.
在这种情况下,您仍然在访问数据,并且您可能需要另外15秒来达到互斥锁解锁(以便在互斥锁中被阻止的另一个线程将解锁并允许控制访问数据).
你是否曾允许另一个线程解锁相同的互斥锁,反过来,允许已经在互斥锁中等待(阻塞)的线程解除阻塞并访问数据?(希望你能得到我在这里说的话.)
根据商定的普遍定义,
所以,如果你非常特别使用二进制信号量而不是互斥量,那么你应该非常小心地"锁定"锁定和解锁,我的意思是,每次锁定的每个控制流都应该打一个解锁调用.不应该有任何"第一次解锁",而应该始终是"第一次锁定".
厕所示例
互斥体:
是厕所的钥匙。一个人可以拥有钥匙——占用厕所——当时。完成后,此人将钥匙交给(释放)队列中的下一个人。
“互斥锁通常用于序列化对不能由多个线程同时执行的可重入代码部分的访问。互斥锁对象只允许一个线程进入受控部分,迫使其他线程尝试访问该部分等到第一个线程从该部分退出。”
(互斥锁实际上是一个值为 1 的信号量。)
信号:
是免费的相同厕所钥匙的数量。例如,假设我们有四个带有相同锁和钥匙的马桶。信号量计数 - 钥匙的数量 - 开始时设置为 4(所有四个厕所都是免费的),然后随着人们进来,计数值递减。如果所有厕所都满了,即。没有剩余的空闲键,信号量计数为 0。现在,当 eq。一个人离开厕所,信号量增加到1(一个空闲键),并给队列中的下一个人。
“信号量将共享资源的同时用户数量限制为最大数量。线程可以请求访问资源(递减信号量),并可以发出信号表示它们已完成使用资源(递增信号量)。”
mutex用于避免多个线程之间的竞争条件.
而信号量用作跨多个过程使用的同步元素.
mutex不能用二进制信号量替换,因为一个进程等待信号量而其他进程释放信号量.如果mutex的获取和释放都由同一个处理.