2009-07-22 34 views
3

请注意,我可以在boost源代码中进行研究,如果没有人有答案,可以这样做来回答我自己的好奇心。boost :: interprocess_mutex vs Win32 native mutexes的性能如何?

但是我这么问,因为也许有人已经做了这个比较,并且可以权威地回答?

这似乎是建立进程之间共享的存储器映射的文件,并通过施工与InterlockedIncrement()一个可以创建一个用户模式很大程度上互斥类似于一个CRITICAL_SECTION,这将是相当比的Win32互斥用于进程间同步更好的性能。

所以我的期望是,可能在boost::interprocess_mutex的Win32上的实现已经以这种方式实现,并且它比本地API产品快得多。

我只是有个假设,我不知道通过现场测试boost::interprocess_mutex的性能是用于进程间同步还是深入研究它的实现。

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

+0

如果我理解你的问题,你似乎要求的是比mutex更有效的关键部分(答案是肯定的)。如果我误解了,请重新提出您的问题。 – 2009-07-22 16:01:34

+2

无法在两个进程之间的共享内存中创建临界区,所以它不是进程间同步的候选机制。 – 2009-07-22 16:14:16

+0

@尼尔 - 在船上留下了你的评论。 – 2009-07-22 16:18:39

回答

1

这似乎是建立进程之间共享的存储器映射的文件,并通过施工用InterlockedIncrement()一个可以创建一个主要用户模式互斥类似于一个CRITICAL_SECTION,这将是相当比的Win32互斥用于进程间更好的性能同步。

CRITICAL_SECTION内部可以在出现争用时使用同步原语。我忘记它是一个事件,信号量还是互斥量。

你可以“安全地”在内存中使用Interlocked函数,所以没有理由不能将它用于跨进程同步,除非那真的很疯狂,你应该使用线程或实际同步原始。

But officially, you can

3

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

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); 
} 

这意味着出现了竞争的boost ::进程间::在Windows互斥是非常昂贵的 - 虽然无竞争的情况下,几乎是免费的。这可以通过添加一个事件对象或类似的睡眠来改进,但是这不适合boost :: interprocess的API,因为无处可以放置访问互斥锁所需的每个进程的HANDLE。