锁定变量与信号量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁定变量与信号量相关的知识,希望对你有一定的参考价值。
锁变量和信号量看起来是相同的。解释它们之间的一个显着差异
我查看了所有笔记,我能找到的就是它们之间的相似之处,例如它们是原子动作和它的共享资源。我似乎无法找到“一个显着的差异”。
你怀疑你的老师试图欺骗你吗?如果没有,有一句古老的格言“如果你已经检查了所有内容但仍无法找到答案,那么你知道的事情就没有错”。
同步机制之间的差异往往是微妙的;并且可能看起来微不足道。例如,信号量和条件变量无状态似乎并不重要 - 任何人都可以将它们唤醒(发布,释放,信号......);而互斥锁是严格有状态的 - 只有声称它的最后一个actor(进程,线程,任务......)(锁定,输入......)才能唤醒它。如果你需要回答“谁拥有这个资源”的问题,那么信号量或条件变量就没有答案;但有一个互斥量。
我假设lock variable
为mutex
。
是。信号量和互斥量似乎相似。有些人使用二进制信号量作为互斥量。
但由于两个主要原因,它们并不相同。
- 意图:Mutex将与代码的关键部分一起使用。它们主要用于确保程序中的一个线程使用资源。如果线程能够锁定互斥锁,则意味着它具有对该资源的独占访问权。 另一方面,信号量将用于生产者 - 消费者案例:当生产者正在生产数据而消费者正在消费数据时。如果考虑将数据存储为资源的容器,则生产者和使用者可以同时处理容器中数据的不同部分。如果有多个消费者,那么访问容器(资源)的消费者数量将受到容器中存在的数据量的限制。 在信号量方面,如果生产者在生成每个数据之后执行sem_post并放入容器并且消费者执行sem_wait,则在访问容器中的数据之前,您将控制访问容器的用户数。信号量不是为了向用户提供资源的独占访问。目的是限制资源的用户数量。
- 用法:Mutex应该被锁定它的线程解锁。在C中,如果线程试图解锁未被其锁定的互斥锁,则行为未定义。在信号量的情况下,一个线程可以只执行semaphore_wait而另一个线程可以执行semaphore_post(这是通常的使用方式)。 (“一个显着的差异”??:D)
一些开发人员使用二进制信号量作为互斥量。因为2.我在上面提到的用法是有风险的。另外,在我看来,这就像是互斥的一种解决方法。在sem_wait的情况下,它几乎就像用互斥锁,计数器,标志和轮询机制替换信号量(非二进制)。代码将适用于此,但它是一个矫枉过正。
有更多的资源:
Difference between binary semaphore and mutex
https://www.geeksforgeeks.org/mutex-vs-semaphore/
以上是关于锁定变量与信号量的主要内容,如果未能解决你的问题,请参考以下文章