【问题标题】:How to create a single process mutex within C++?如何在 C++ 中创建单进程互斥锁?
【发布时间】:2021-04-09 06:24:02
【问题描述】:

因此,我正在阅读有关监视器与互斥锁的文章,并发现有人提到监视器是更快的互斥锁,因为它们不会锁定系统范围,而只会锁定给定进程的线程。

C++ 中有什么方法可以完成或模拟这个吗?

编辑:我现在很好奇系统范围的互斥锁和仅限于特定进程的互斥锁之间有什么区别。

【问题讨论】:

标签: c++ performance mutex monitor


【解决方案1】:

C++ 标准没有定义系统范围和每个进程的原语。所以C++没有指定std::mutex是否是系统范围的。

合理的实现有高效的每进程std::mutex;要拥有系统范围的互斥锁,您需要为您的平台使用库或操作系统对象

不同之处在于每个进程互斥体可以使用任何内存操作来避免系统调用,因为进程内存在进程的线程之间共享。对该内存的原子操作更有效,并且通常通过它们避免系统调用。系统范围的互斥锁要么从系统调用开始(效率不高),要么必须使用共享内存(可能不安全,也可能有一些开销)。

【讨论】:

    【解决方案2】:

    @Alex Guteniev 的答案尽可能准确(应该被认为是公认的答案)。它指出 C++ 标准没有定义系统范围的概念,并且所有实际目的的互斥锁都是每个进程的,即用于单个进程中线程(执行代理)之间的同步(因此根据您的需要)。 C++ 明确了线程 (std::thread) 是什么(33.3 - ...旨在与操作系统线程一对一映射(在我的草稿中,至少...N4687))。 如here 所述,Microsoft post VC2015 改进了他们的实现以使用 Windows 原语。在最受好评的答案中也指出了here。我还查看了 Microsoft 的 boost library 实现(通常先于/影响 c++ 标准),并且 (AFAICT) 它不使用任何进程间调用。

    所以回答你的问题。如果this definition 被认为是准确的,那么在 C++ 中线程和监视器实际上是相同的。

    【讨论】:

    • 感谢您的所有研究,虽然我很欣赏亚历克斯的回答,但您显然已经做了更多的研究,并且有一些人们可能会发现方便的额外信息。谢谢维尔纳!人们可能想知道我的回答中的一件事:您可以使用官方操作系统特定的原语强制只处理互斥锁。
    【解决方案3】:

    更新,在研究相关内容时偶然发现了这个问题的答案。

    在 Windows 上,关键部分可用于单个进程而不是系统范围的互斥锁,并且通常更快:

    编辑: 虽然上述陈述是正确的,但 c++ 没有系统范围的互斥锁 的概念。此概念仅在使用特定于操作系统的原语(例如 win32 CreateMutex)时存在,并且与 std c++ 无关。

    来源: std::mutex performance compared to win32 CRITICAL_SECTION

    在 Linux 上,pthreads 用于进程。

    【讨论】:

    • 这是误导。您已经回答了自己的问题,但您回答错误。您站点的源显示 std::mutex 在更现代的 VCC 编译器版本上更快。 std::mutex 在实践中总是用于单个进程(并且你现在可以看到更快)。此外,当您在 Linux 上声明 PThreads 用于进程时,这意味着什么。 PThreads 是一个线程库。是的,线程在进程中运行,但 PThreads 是一个恰好支持互斥锁的线程库。
    • 欢迎您写一个新的答案来解释这一点,我会接受那个答案。问题的重点是,我只想出于性能原因指定特定于当前进程的互斥锁。
    • 参考您的链接,投票最多的答案是“请在答案末尾查看我的更新,自 Visual Studio 2015 以来情况发生了巨大变化。”。问题不在于 std::mutex,而在于具体的实现。
    • @Alex Guteniev 的回答非常准确。 In 声明 C++ 标准没有定义系统范围的概念,并且所有实际用途的互斥锁都是每个进程(因此根据您的需要)。
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多