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


阅读SO

上关于两者之间差异(互斥体和信号量)的各种帖子,我得出以下结论,如果我错了,请纠正我。这主要与窗口有关。我知道关键部分是代码中需要保护的部分(即不能同时被多个线程访问)。现在为了保护那些关键部分,使用了互斥体。这些互斥锁可以是算法或数据结构。现在互斥锁通常有两种风格(进程内和进程间)。对于没有调用内核进行锁定的进程内,我们可以使用 Boost 线程同步原语,例如 lock_guardunique_lockshared_lock(单个写入器/多个读取器),对于进程间,我们可以使用 Boost 进程间信号量。现在这些进程间互斥锁基本上称为信号量。我得出的结论是是因为这个帖子,其中指出

信号

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

现在提升进程间状态

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

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

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

信号量与

互斥锁相同,但允许 x 个线程 进入。

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

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

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

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

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

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

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

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

最新更新