锁定变量与信号量



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

我浏览了我所有的笔记,我能找到的只是它们之间的相似之处,例如它们是原子操作,它是一个共享资源。我似乎找不到"一个显着差异"。

你怀疑你的老师在欺骗你吗? 如果没有,有一句古老的格言"如果你检查了所有内容,但仍然找不到答案,那么你知道的事情没有错"。

同步机制之间的差异通常是微妙的;并且可能看起来微不足道。 例如,信号量和条件变量是无状态的似乎并不重要——任何人都可以唤醒它们(发布、释放、信号等);而互斥锁是严格有状态的——只有最后一个声明它的参与者(进程、线程、任务等)(锁定、回车等)才能唤醒它。 如果您需要回答"谁拥有此资源"的问题,则信号量或条件变量没有答案;但是有一个互斥锁。

我假设lock variablemutex.

是的。信号量和互斥体看起来很相似。有些人使用二进制信号量作为互斥锁。

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

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

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

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

  2. 用法:互斥体应由锁定它的线程解锁。在 C 中,如果线程尝试解锁未被其锁定的互斥锁,则行为未定义。在信号量的情况下,一个线程可以只做semaphore_wait,另一个线程可以semaphore_post(这是通常的使用方式)。("一个显着差异"?? :D )

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

还有更多关于此的资源:

二进制信号量和互斥锁之间的区别

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

最新更新