2011-02-28 79 views
10

我对跨平台IPC的默认选择是提升,但当我问及这个问题时,我看到它在两个不同的论坛上受到批评。也许这只是一个巧合,那么对于提升IPC以及总体选择跨平台C++ IPC库有什么想法?Boost IPC有什么好处?

对于Windows开发,我们使用VC++ 2008作为参考。

编辑:这里是我见过的做注释的例子(不能没事找到它们):

升压,这是废话。至少在 窗口。互斥体不使用WinAPI,而是创建它自己的 基于文件的实现(WinAPI = 内核对象)。如果您的程序 崩溃,文件将不会被删除。 下次启动程序时 无法创建互斥锁,因为 是现有文件。

+1

缺少您需要的功能?如果答案是没有,我不明白为什么你需要担心其他人可能不会分享你的需求的“批评”... – Nim

+1

他们究竟批评什么?你能提供链接吗?就像这样,问题太模糊 –

+2

这不是特征,而是被批评的实现。我不明白这个问题是如何模糊的......如果Boost的实现存在问题,那么分享它们,如果有更好的库,请列出它们。 –

回答

7

从我有限的Boost.Interprocess经验中,我没有任何重大问题,但我无法真正评论性能。虽然确实使用在程序文件夹外部创建的文件来完成它们的工作,但它们都应该是内存映射的,这可以消除大多数性能问题。无论如何,当你使用IPC时,你应该总是期望额外的性能开销。

至于您突出强调的批评,可以删除一个已命名的互斥体或任何其他命名资源,这些资源已被前一个进程留下(请参阅静态的remove(const char*)函数)。公平地说,取决于您的应用程序,正确使用这可能会非常棘手,这在使用Windows API时不是您必须处理的。另一方面,Windows API不可移植。我的猜测是,他们使用文件(即使有更好的替代方案),以保持库的界面和行为在不同平台之间保持一致。

无论如何,命名互斥体只是图书馆提供的一小部分。其中一个更有用的功能是它提供了own memory managers for the shared memory region其中包括STL allocators。我个人觉得使用它提供的高级构造与原始内存一起工作会更愉快。


更新:我没多一些挖Boost文档中,我在各种有趣的TID位传来:

This page提供有关执行情况的一些详细信息和库的性能,但不包含实施原理。

This link明确指出他们的Windows互斥体实现可以使用一些工作(版本1.46)。如果您在boost\interprocess\sync文件夹中进一步挖掘,您会注意到另外两个名为posixemulation的文件夹。这两个都包含同步原语的实现细节。为interprocess_mutex::lock POSIX的实现是你期望什么,但仿真的实现是非常基本的:

// Taken from Boost 1.40. 
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); 
} 

所以由它的外观,它们的目的是对POSIX的支持和blobbed一切成使用内存映射的仿真层文件。如果你想知道他们为什么不提供专门的Windows实现,那么我建议你询问Boost邮件列表(我在文档中找不到任何东西)。

+0

嗯,很多东西在不同的操作系统上有不同的工作方式,这就是为什么我们需要类库的提升等等。我的印象是,Linux拥有自己更高效的机制,比如Windows,所以我期望跨平台的库使用每个平台的高效机制并为我提供一致的抽象。 –

+0

@John问题在于你会减少可移植性,同时增加库的大小和复杂性。如果你不得不为你想支持的每个操作系统重新编写大部分库,那么你可能会做错了。请注意,这是纯粹的猜测。你总是可以试着在Boost邮件列表上询问。 –

+1

跨平台库的重点在于它包含了低级别的东西,这些东西在不同的平台上有着不同的共同抽象。事实上,这些低层次的事情是不同的,例如图书馆的整个观点......看看跨平台的GUI库。 –

1

这是不是直接回答你的问题,而是一个选择:如果您对开发环境进行选择,那么你可以考虑Qt和the D-bus implementation in Qt

+0

不,我不能重写整个应用程序来使用新的框架:)。 –