【问题标题】:Difference between a mutex and semaphore - intra process and inter process互斥量和信号量之间的区别 - 进程内和进程间
【发布时间】:2015-01-23 01:50:21
【问题描述】:

阅读关于SO的各种帖子(互斥量和信号量)我得出以下结论,如果我错了,请纠正我。这主要与Windows有关。我了解关键部分是代码中需要保护的部分(即多个线程不能同时访问)。现在为了保护那些关键部分,互斥体被使用了。这些互斥锁可以是算法或数据结构。现在互斥锁通常可以有两种形式(进程内和进程间)。对于没有调用内核进行锁定的内部进程,我们可以使用Boost Thread synchronization primitives,例如lock_guardunique_lockshared_lock(单写/多读),对于进程间,我们可以使用@987654322 @.现在这些进程间互斥体基本上被称为信号量。我得出结论的原因 是因为this post 声明

信号量是信号机制(“我完成了,你可以继续”的那种 信号)。例如,如果您正在听歌曲(假设它是一首 任务)在您的手机上,同时您的朋友给您打电话, 中断将被触发,其上的中断服务程序 (ISR) 将通知呼叫处理任务唤醒。

现在提升进程间状态

.. Boost.Interprocess 实现了类似的同步机制 来自不同进程的线程。

如果我对信号量的理解方向正确,请告诉我。

现在我不明白的信号量的另一个定义来自here 选择的答案状态

信号量与互斥量相同,但允许 x 个线程 输入。

哪个正确描述了信号量的作用?它允许进程间资源保护还是允许特定数量的线程访问资源?如果是第二个,它不会破坏资源,因为多个线程正在访问它。

【问题讨论】:

  • 在 Windows 中,信号量是一个事件,请参阅 CreateEvent
  • 可以在这里找到一个很好的解释:koti.mbnet.fi/niclasw/MutexSemaphore.html 底线:互斥锁是一个值为 1 的信号量。基本上,资源是由多个线程还是由多个进程访问都没有关系。访问内存时存在差异,但这是另一个问题。

标签: c++ multithreading boost mutex semaphore


【解决方案1】:

信号量是一种围绕整数值构建的同步机制。锁定信号量(通常称为“等待信号量”)会减小该值,除非它为 0。在这种情况下,线程会停止,直到信号量值大于 0,因此可以适当地减小它。解锁信号量(通常称为“发布”或“信号”)无条件地将值增加 1。

通常在创建信号量时,您需要为其分配一个起始值。如果设置的值大于 1,则可以让多个线程输入受信号量“保护”的代码。

现在,互斥锁是一种二进制同步原语。从概念上讲,它可以与初始值为 1 的信号量进行比较。只有单个线程可以输入受互斥体保护的代码。

我不了解 Windows 世界,但在 Unix 上,信号量是一种操作系统结构,可用于同步多个进程。 Pthread 互斥锁通常用于协调单个进程内的线程,但也有一些技巧允许使用互斥锁进行进程间同步(共享内存块和创建互斥锁的特殊方法)。

【讨论】:

  • 感谢您的回答“如果您设置的值大于 1,则可以让多个线程输入受信号量“保护”的代码。我遇到了 [this][1] post,它提供了一个信号量的示例代码。您是说当访问受保护的资源时计数会减少? [1]:stackoverflow.com/questions/3928853/… - 谁叫锁?谁打电话给信号?
  • 是的。当计数为 0 时,wait 有一个 --count_condition_.wait()signal() 有一个无条件的 ++count_condition_.notify_one() 来唤醒任何等待条件变量的线程。
  • 那么你是说需要保护的代码应该在这个信号量类中?您能否给出一个粗略的代码示例,说明如何将此类用于 3 个线程?
  • 不,受保护的代码在信号量之外。注释不允许输入格式良好的代码。基本上,当您希望最多三个线程访问临界区时,您创建初始值为 3 (semaphore s(3);) 的信号量,然后您的代码块被 waitsignal 包围:s.wait(); /* protected code */; s.signal()
  • 您可以使用值为 1 的信号量来防止竞争条件。但是,还有其他考虑因素,例如性能或代码可读性,使互斥锁更适合该工作。
【解决方案2】:

Mutex 用于需要同步的单个对象实例(或 OP 提到的关键代码部分访问)的情况。示例:单个生产者-消费者访问队列/内存块。如果生产者当前已锁定互斥锁。在生产者释放它之前,消费者将被锁定(阻止)使用它。

信号量用于有多个共享资源实例的情况。因此,当添加新资源时,我们会执行 sem_post,而当获取或使用资源时,我们会执行 sem_wait(decrement) 。当计数低于 0 时, shm_wait 将被阻止。这是系统 V 中的一个示例。

回到上面的消费者-生产者示例的队列访问示例,可能有 4KB 可用,并且为了这里的论证,可以将访问原子地划分为 1KB,假设。因此,当所有 4KB 都可用时,信号量可以增加到 4,当没有可用时,信号量可以增加到 0。

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2020-04-05
    • 2017-11-19
    • 2014-06-24
    • 2013-07-01
    • 2013-08-20
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多