锁定变量与信号量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁定变量与信号量相关的知识,希望对你有一定的参考价值。

锁变量和信号量看起来是相同的。解释它们之间的一个显着差异

我查看了所有笔记,我能找到的就是它们之间的相似之处,例如它们是原子动作和它的共享资源。我似乎无法找到“一个显着的差异”。

答案

你怀疑你的老师试图欺骗你吗?如果没有,有一句古老的格言“如果你已经检查了所有内容但仍无法找到答案,那么你知道的事情就没有错”。

同步机制之间的差异往往是微妙的;并且可能看起来微不足道。例如,信号量和条件变量无状态似乎并不重要 - 任何人都可以将它们唤醒(发布,释放,信号......);而互斥锁是严格有状态的 - 只有声称它的最后一个actor(进程,线程,任务......)(锁定,输入......)才能唤醒它。如果你需要回答“谁拥有这个资源”的问题,那么信号量或条件变量就没有答案;但有一个互斥量。

另一答案

我假设lock variablemutex

是。信号量和互斥量似乎相似。有些人使用二进制信号量作为互斥量。

但由于两个主要原因,它们并不相同。

  1. 意图:Mutex将与代码的关键部分一起使用。它们主要用于确保程序中的一个线程使用资源。如果线程能够锁定互斥锁,则意味着它具有对该资源的独占访问权。 另一方面,信号量将用于生产者 - 消费者案例:当生产者正在生产数据而消费者正在消费数据时。如果考虑将数据存储为资源的容器,则生产者和使用者可以同时处理容器中数据的不同部分。如果有多个消费者,那么访问容器(资源)的消费者数量将受到容器中存在的数据量的限制。 在信号量方面,如果生产者在生成每个数据之后执行sem_post并放入容器并且消费者执行sem_wait,则在访问容器中的数据之前,您将控制访问容器的用户数。信号量不是为了向用户提供资源的独占访问。目的是限制资源的用户数量。
  2. 用法:Mutex应该被锁定它的线程解锁。在C中,如果线程试图解锁未被其锁定的互斥锁,则行为未定义。在信号量的情况下,一个线程可以只执行semaphore_wait而另一个线程可以执行semaphore_post(这是通常的使用方式)。 (“一个显着的差异”??:D)

一些开发人员使用二进制信号量作为互斥量。因为2.我在上面提到的用法是有风险的。另外,在我看来,这就像是互斥的一种解决方法。在sem_wait的情况下,它几乎就像用互斥锁,计数器,标志和轮询机制替换信号量(非二进制)。代码将适用于此,但它是一个矫枉过正。

有更多的资源:

Difference between binary semaphore and mutex

https://www.geeksforgeeks.org/mutex-vs-semaphore/

以上是关于锁定变量与信号量的主要内容,如果未能解决你的问题,请参考以下文章

锁定AppendAllText与TextWriter

pthreads等待和信号疑问linux

如何在不锁定活动方向的情况下锁定片段方向?

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

C系统v信号量不锁定关键区域

编写高质量代码改善C#程序的157个建议——建议72:在线程同步中使用信号量