互斥体和信号量之间的区别 - 内部进程和进程间

时间:2014-11-25 06:41:16

标签: c++ multithreading boost mutex semaphore

阅读关于两者之间差异的各种帖子(互斥和信号量)我得出以下结论如果我错了请纠正我。这主要与windows有关。我知道关键部分是代码中需要保护的部分(即)不能同时被多个线程访问。现在,为了保护这些关键部分,使用了 Mutexes 。这些互斥锁可以是算法或数据结构。现在,互斥体通常可以有两种形式(进程内和进程间)。对于没有调用内核进行锁定的内部进程,我们可以使用lock_guardunique_lockshared_lock,{{1}}(单个编写器/多个读取器)以及进程间我们可以使用Boost Thread synchronization primitives。现在这些进程间互斥体基本上称为信号量。我得出结论的原因 是因为Boost Interprocess semaphore帖子说明了

  

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

现在提升进程间状态

  

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

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

现在另一个我不理解的信号量定义来自this 选定的答案状态

  

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:0)

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

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

回到上面的消费者 - 生产者示例的队列访问示例,可能有4KB可用,并且为了参数起见,可以将访问自动地划分为1KB,比方说。因此,当所有4KB可用时,信号量可以递增到4,当没有可用时,信号量可以递增到0。