如何在 C++ 中创建单个进程互斥锁?
How to create a single process mutex within C++?
所以我正在阅读有关监视器与互斥体的文章,并发现有人提到监视器是更快的互斥体,因为它们不会在整个系统范围内锁定,而只会跨给定进程的线程锁定。
在 C++ 中有什么方法可以完成或模拟这个吗?
编辑:我现在很好奇系统范围的互斥体和仅限于特定进程的互斥体之间的区别。
C++ 标准没有定义系统范围与每个进程的原语。所以C++没有指定std::mutex
是否是系统范围的。
合理的实现具有高效的每个进程std::mutex
;要拥有系统范围的互斥锁,您需要为您的平台使用库或操作系统对象
区别在于每个进程的互斥体可以使用任何内存操作来避免系统调用,因为进程内存在进程的线程之间共享。对该内存的原子操作效率更高,并且通常通过它们避免系统调用。系统范围的互斥量要么从系统调用开始(效率不高),要么必须使用共享内存(可能不安全,也仍然可能有一些开销)。
更新,在研究相关内容时偶然发现了这个问题的答案。
在 Windows 上,临界区可用于单个进程而不是系统范围的互斥锁,并且通常速度更快:
编辑:
虽然上面的说法是正确的,但 c++ 没有 system wide mutex 的概念。此概念仅在使用 OS 特定原语(例如 win32 CreateMutex)时存在,与标准 c++ 无关。
来源:
std::mutex performance compared to win32 CRITICAL_SECTION
在 Linux,pthreads 用于进程。
@Alex Guteniev 的回答非常准确(并且应该被视为公认的答案)。它指出 c++ 标准没有定义系统范围的概念,并且所有实际目的的互斥量都是每个进程的,即用于单个进程中线程(执行代理)之间的同步(因此根据您的需要)。 C++ 明确了线程 (std::thread) 是什么(33.3 - ... 旨在与 OS 线程一对一映射(在我的草案中,至少......N4687))。
Microsoft post VC2015 已改进其实现以使用 windows 基元,如所述 here. This is also indicated here in the most upvoted answer. I've also looked at the boost library 实现(通常 precedes/influences c++ 标准)用于微软和(AFAICT)它不使用任何进程间调用。
所以回答你的问题。在 C++ 中,如果 被认为是准确的,那么线程和监视器实际上是同一件事。
所以我正在阅读有关监视器与互斥体的文章,并发现有人提到监视器是更快的互斥体,因为它们不会在整个系统范围内锁定,而只会跨给定进程的线程锁定。
在 C++ 中有什么方法可以完成或模拟这个吗?
编辑:我现在很好奇系统范围的互斥体和仅限于特定进程的互斥体之间的区别。
C++ 标准没有定义系统范围与每个进程的原语。所以C++没有指定std::mutex
是否是系统范围的。
合理的实现具有高效的每个进程std::mutex
;要拥有系统范围的互斥锁,您需要为您的平台使用库或操作系统对象
区别在于每个进程的互斥体可以使用任何内存操作来避免系统调用,因为进程内存在进程的线程之间共享。对该内存的原子操作效率更高,并且通常通过它们避免系统调用。系统范围的互斥量要么从系统调用开始(效率不高),要么必须使用共享内存(可能不安全,也仍然可能有一些开销)。
更新,在研究相关内容时偶然发现了这个问题的答案。
在 Windows 上,临界区可用于单个进程而不是系统范围的互斥锁,并且通常速度更快:
编辑: 虽然上面的说法是正确的,但 c++ 没有 system wide mutex 的概念。此概念仅在使用 OS 特定原语(例如 win32 CreateMutex)时存在,与标准 c++ 无关。
来源: std::mutex performance compared to win32 CRITICAL_SECTION
在 Linux,pthreads 用于进程。
@Alex Guteniev 的回答非常准确(并且应该被视为公认的答案)。它指出 c++ 标准没有定义系统范围的概念,并且所有实际目的的互斥量都是每个进程的,即用于单个进程中线程(执行代理)之间的同步(因此根据您的需要)。 C++ 明确了线程 (std::thread) 是什么(33.3 - ... 旨在与 OS 线程一对一映射(在我的草案中,至少......N4687))。 Microsoft post VC2015 已改进其实现以使用 windows 基元,如所述 here. This is also indicated here in the most upvoted answer. I've also looked at the boost library 实现(通常 precedes/influences c++ 标准)用于微软和(AFAICT)它不使用任何进程间调用。
所以回答你的问题。在 C++ 中,如果