C++ 互斥和信号量之间的区别-进程内和进程间

C++ 互斥和信号量之间的区别-进程内和进程间,c++,multithreading,boost,mutex,semaphore,C++,Multithreading,Boost,Mutex,Semaphore,通过阅读各种帖子,我得出了如下结论:如果我错了,请纠正我。这主要与windows有关。我理解关键部分是代码中需要保护的部分(即不能由多个线程同时访问)。现在为了保护这些关键部分,使用了互斥体。这些互斥体可以是算法或数据结构。现在互斥体通常有两种风格(进程内和进程间)。对于不调用内核进行锁定的进程内,我们可以使用诸如lock\u-guard、unique\u-lock、shared\u-lock(单写器/多读器)和进程间互斥锁。现在这些进程间互斥锁基本上被称为信号量。我得出结论的原因是 是因为哪个

通过阅读各种帖子,我得出了如下结论:如果我错了,请纠正我。这主要与windows有关。我理解关键部分是代码中需要保护的部分(即不能由多个线程同时访问)。现在为了保护这些关键部分,使用了互斥体。这些互斥体可以是算法或数据结构。现在互斥体通常有两种风格(进程内和进程间)。对于不调用内核进行锁定的进程内,我们可以使用诸如
lock\u-guard
unique\u-lock
shared\u-lock
(单写器/多读器)和进程间互斥锁。现在这些进程间互斥锁基本上被称为信号量。我得出结论的原因是 是因为哪个州的邮政局

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

现在提升进程间状态

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

请让我知道我对信号灯的理解是否正确

另一个我不理解的信号量的定义来自 所选答案为:

信号量的作用与互斥量相同,但允许x个线程执行 进入


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

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

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

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


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

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

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


回到上面的队列访问示例,对于消费者-生产者示例,可能有4KB可用,并且为了便于讨论,可以将访问原子划分为1KB,比方说。因此,当所有4KB可用时,信号量可以增加到4,当没有可用时,信号量可以增加到0

在windows中,信号量是一个事件。请看下面的解释:底线:互斥量是一个值为1的sempahore。基本上,资源是由多个线程还是多个进程访问并不重要。访问内存时会有差异,但这是另一个问题。感谢您的回答,您说“如果您设置的值大于1,您可以让多个线程输入受信号量“保护”的代码。”我遇到了[这][1]篇文章,它提供了信号量的示例代码。您是说当访问受保护的资源时,计数会递减吗?[1] 谁叫洛克?谁呼叫信号?是的<当计数为0时,code>wait有一个
--count\u
条件\uU4.wait()
signal()
有一个无条件的
++count\u
条件。notify\u one()
唤醒任何等待条件变量的线程。那么您是说需要保护的代码应该在这个信号量类中?你能给出一个粗略的代码示例,说明这个类如何与3个线程一起使用吗?不,受保护的代码在信号量之外。注释不允许输入格式良好的代码。基本上,当您希望最多三个线程访问一个关键部分时,您可以创建初始值为3的信号量(
semaphore s(3);
),然后您的代码块被
wait
signal
s.wait();/*受保护代码*/;s、 signal()
。您可以使用值为1的信号量来防止竞争条件。然而,还有其他考虑因素,如性能或代码可读性,使互斥锁更好地完成这项工作。