如何解决如何在 C++ 中创建单个进程互斥锁?
因此,我正在阅读有关监视器与互斥锁的相关信息,并发现有人提到监视器是更快的互斥锁,因为它们不会在系统范围内锁定,而只会跨给定进程的线程进行锁定。
在 C++ 中有什么方法可以完成或模拟这个吗?
编辑:我现在很好奇系统范围的互斥锁和仅限于特定进程的互斥锁有什么区别。
解决方法
C++ 标准没有定义系统范围与每个进程的原语。所以 C++ 没有指定 std::mutex
是否是系统范围的。
合理的实现具有高效的每个进程std::mutex
;要拥有系统范围的互斥锁,您需要为您的平台使用库或操作系统对象
不同之处在于每个进程的互斥锁可以使用任何内存操作来避免系统调用,因为进程内存在进程的线程之间共享。该内存上的原子操作更有效,并且通常通过它们避免系统调用。系统范围的互斥量要么以系统调用开始(效率不高),要么必须使用共享内存(可能不安全,也可能会有一些开销)。
,更新,在研究相关内容时偶然发现了这个答案。
在 Windows 上,临界区可用于单个进程而不是系统范围的互斥体,而且通常速度更快:
编辑: 虽然上述说法是正确的,但 C++ 没有系统范围互斥量的概念。此概念仅在使用操作系统特定原语(例如 win32 CreateMutex)时存在,与 std c++ 无关。
来源: std::mutex performance compared to win32 CRITICAL_SECTION
在 Linux 上,pthread 用于进程。
,@Alex Guteniev 的回答尽可能准确(应该被视为已接受的答案)。它指出 c++ 标准没有定义系统范围的概念,并且用于所有实际目的的互斥锁是每个进程的,即用于单个进程中线程(执行代理)之间的同步(因此根据您的需要)。 C++ 明确了线程 (std::thread) 是什么(33.3 - ...打算与操作系统线程一对一映射(在我的草案中,至少... N4687))。 Microsoft 发布 VC2015 已改进其实现以使用 Windows 原语,如here 所述。这也在最受好评的答案中表示 here。我还查看了 microsoft 的 boost library 实现(通常先于/影响 C++ 标准),并且 (AFAICT) 它不使用任何进程间调用。
所以来回答你的问题。在 C++ 中,如果 this definition 被认为是准确的,那么线程和监视器实际上是一回事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。