锁定变量与信号量

时间:2019-04-15 21:13:12

标签: variables concurrency locking semaphore

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

我仔细阅读了所有笔记,发现它们之间的相似之处,例如它们是原子动作及其共享资源。我似乎找不到“一个明显的不同”。

2 个答案:

答案 0 :(得分:1)

Do you suspect your teacher is trying to trick you? If not, there is an old adage "if you have checked everything and still can't find the answer, then something you know isn't wrong".

The difference between synchronization mechanisms is often subtle; and may seem insignificant. For example, it might not seem important that a semaphore and a condition variable are stateless -- anybody can wake them up (post, release, signal, ...); whereas a mutex is strictly stateful -- only the last actor (process, thread, task, ...) that claimed it ( lock, enter, ...) can wake it up. If you need to answer the question "who owns this resource", there is no answer for a semaphore or condition variable; but there is for a mutex.

答案 1 :(得分:0)

我假设lock variablemutex

是的。信号量和互斥量似乎相似。有些人将二进制信号量用作互斥体。

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

  1. 意图:Mutex将与代码的关键部分一起使用。它们主要用于确保程序中的一个线程使用资源。如果线程能够锁定互斥锁,则意味着它对该资源具有独占访问权。

    另一方面,在生产者-消费者的情况下将使用信号量:当生产者正在生产数据而消费者正在消耗数据时。如果考虑将数据存储为资源的容器,则生产者和使用者可以同时处理容器中数据的不同部分。如果有多个使用者,则访问容器(资源)的使用者数量将受到容器中存在的数据量的限制。

    用信号量的术语来说,如果生产者在生成每条数据并放入容器之后执行sem_post,而消费者在访问容器中的数据之前执行sem_wait,则您要控制访问该容器的用户数量。信号量并不意味着向用户提供资源的独占访问。目的是限制资源的用户数量。

  2. 用法:互斥锁应该由已锁定互斥锁的线程解锁。在C中,如果线程尝试解锁未被其锁定的互斥锁,则该行为是不确定的。对于信号量,一个线程可以执行semaphore_wait,而另一个线程可以进行semaphore_post(这是正常使用的方式)。 (“显着差异” ??:D)

一些开发人员使用二进制信号量作为互斥量。有风险,因为 2。用法 我已经在上面提到过。而且,在我看来,这就像解决互斥锁一样。几乎就像在sem_wait的情况下用互斥锁,计数器,标志和轮询机制替换信号量(非二进制)。该代码将与此一起工作,但这是一个过大的选择。

关于此的更多资源:

Difference between binary semaphore and mutex

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