Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::进程间互斥与Win32本机互斥的性能如何?_C++_Windows_Winapi_Boost_Synchronization - Fatal编程技术网

C++ boost::进程间互斥与Win32本机互斥的性能如何?

C++ boost::进程间互斥与Win32本机互斥的性能如何?,c++,windows,winapi,boost,synchronization,C++,Windows,Winapi,Boost,Synchronization,请注意,我可以在boost源代码中进行研究,如果没有人给出答案,我可以这样做来回答我自己的好奇心 然而,我问,因为也许有人已经做了这个比较,可以权威地回答 似乎在进程之间创建一个共享内存映射文件,并通过使用InterlockedIncrement()构造,可以创建一个类似于CRITICAL\u部分的用户模式互斥体,这在进程间同步方面比Win32互斥体的性能要高得多 因此,我的期望是,在Win32上实现的boost::interprocess\u mutex可能就是以这种方式实现的,而且它比本机A

请注意,我可以在boost源代码中进行研究,如果没有人给出答案,我可以这样做来回答我自己的好奇心

然而,我问,因为也许有人已经做了这个比较,可以权威地回答

似乎在进程之间创建一个共享内存映射文件,并通过使用
InterlockedIncrement()
构造,可以创建一个类似于
CRITICAL\u部分的用户模式互斥体,这在进程间同步方面比Win32互斥体的性能要高得多

因此,我的期望是,在Win32上实现的
boost::interprocess\u mutex
可能就是以这种方式实现的,而且它比本机API提供的速度要快得多

然而,我只有一个假设,通过现场测试,我不知道
boost::interprocess\u mutex
对于进程间同步的性能,也不知道它的实现

是否有人有使用InterlockedIncrement()或分析其相对性能的经验,或者他们是否可以对跨使用共享内存的进程使用InterlockedIncrement()的安全性发表评论

似乎在进程之间创建一个共享内存映射文件,并通过InterlockedIncrement()的构造,可以创建一个类似于关键_部分的用户模式互斥体,这比Win32互斥体在进程间同步方面的性能要高得多

CRITICAL_部分
内部可以在出现争用时使用同步原语。我忘了它是事件、信号量还是互斥

您可以“安全地”在内存上使用
互锁
函数,因此没有理由不能将其用于跨进程同步,除此之外,这将非常疯狂,您可能应该使用线程或真正的同步原语


.

在boost 1.39.0中,只有对pthreads的特定支持。在所有其他平台上,它变成一个繁忙的循环,中间有一个收益率调用(基本上与您所描述的系统相同)。请参阅boost/interprocess/sync/emulation/interprocess_mutex.hpp。例如,下面是lock()的实现:

inline void进程间互斥锁::锁(void)
{
做{
boost::uint32\u t prev\u s=细节::原子cas32(常量转换(&m),1,0;
如果(m_s==1&&prev_s==0){
打破
}
//放弃当前时间片
细节::螺纹_屈服();
}虽然(正确);
}

这意味着windows上竞争的boost::interprocess::mutex非常昂贵——尽管无竞争的情况几乎是免费的。这可以通过添加事件对象或类似的sleep-on来改进,但这不适合boost::interprocess的API,因为没有任何地方可以放置访问互斥体所需的每个进程句柄。

如果我理解您的问题,您可能会问,这是一个比互斥体更有效的关键部分(答案是肯定的)。如果我有误解,请重新表述您的问题。关键部分不能在两个进程之间的共享内存中创建,因此它不是进程间同步的候选机制。@Neil-采纳了您的意见。这也是我所相信的,我只是找不到关于在中使用联锁增量的知识Windows上的Enterprise进程同步。boost暗示它可以做到。这可能是一个稍微模糊的问题,因为共享内存不是Win32平台上经常使用的技术,因为线程框架的流行性和开发专业知识。在第一段的最后一句中,在联锁API下,它说y您可以使用它们跨进程共享内存。“如果变量位于共享内存中,则不同进程的线程可以使用这些函数。”很好,谢谢我想知道是否有人在他们的实现中使用过这个工具?这种实现的一个问题是,您需要手动处理终止的进程。也就是说,一个进程锁定共享互斥体,由于错误而终止--互斥体保持锁定。由于操作系统现在不再处理这个问题,互斥锁将永远保持锁定状态——因此也需要存储所有者等。我真的很安全,执行起来工作量很大。Interprocess在Win32上不提供这样的功能。不是开玩笑。这就是为什么您最好使用win32互斥,而不是使用自己的互斥。任何“高性能”跨进程通信无论如何都不可能是高性能的。进程本地存储是malloc()或new:)
inline void interprocess_mutex::lock(void)
{
   do{
      boost::uint32_t prev_s = detail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0);

      if (m_s == 1 && prev_s == 0){
            break;
      }
      // relinquish current timeslice
      detail::thread_yield();
   }while (true);
}