【问题标题】:Is Boost IPC any good? [closed]Boost IPC 好用吗? [关闭]
【发布时间】:2011-07-05 15:33:19
【问题描述】:

我对跨平台 IPC 的默认选择是 boost,但是当我询问它时,我看到它在两个不同的论坛中受到批评,这让我很担心。或许这只是一个巧合,那么对于 boost IPC 和选择跨平台的 C++ IPC 库,一般有什么想法呢?

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

编辑:这是我见过的 cmets 示例(现在找不到它们):

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

【问题讨论】:

  • 缺少哪些您需要的功能?如果这个问题的答案是否定的,我不明白为什么你需要担心可能不符合你要求的其他人的“批评”......
  • 他们到底在批评什么?你能提供链接吗?就是这样,问题太模糊了
  • 受到批评的不是功能而是实现。我不明白这个问题是如何含糊的......如果 Boost 的实现有问题,然后分享它们,如果有更好的库,列出它们。
  • 这是我第一次听到这样的问题,但是我的windows经验非常有限。您最初的问题是关于 boost IPC 的问题。事实上,这个问题看起来更像是一个咆哮。您能否提供确认这些问题的链接或示例?
  • 当然不能。这就是问题的全部要点,看看这些声称的问题是否有效。

标签: c++ visual-studio-2008 boost ipc cross-process


【解决方案1】:

根据我在 Boost.Interprocess 方面的有限经验,我没有遇到任何重大问题,但我无法对性能发表评论。虽然它确实使用在程序文件夹之外创建的文件来完成它的工作,但它们都应该是内存映射的,这可以消除大多数性能问题。在任何情况下,当您使用 IPC 时,您总是应该期待一些额外的性能开销。

至于您强调的​​批评,可以删除先前进程留下的命名互斥锁或任何其他命名资源(请参阅静态remove(const char*) 函数)。公平地说,根据您的应用程序,正确使用可能会很棘手,这不是您在使用 Windows API 时必须处理的事情。另一方面,Windows API 不可移植。我的猜测是他们使用文件(即使存在更好的替代方案)来保持库的界面和行为在不同平台上保持一致。

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


更新:我在 Boost 文档中进行了更多挖掘,发现了各种有趣的花絮:

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,并将其他所有内容都放入一个使用内存映射文件的仿真层中。如果您想知道他们为什么不提供专门的 Windows 实现,那么我建议您询问 Boost 邮件列表(我在文档中找不到任何内容)。

【讨论】:

  • 嗯,很多事情在不同的操作系统上工作方式不同,这就是为什么我们需要库,如 boost 等。我的印象是 Linux 有它自己更有效的机制,像 Windows 一样,所以我希望跨平台库能够使用每个平台的高效机制并为我提供一致的抽象。
  • @John 这样做的问题是您会降低可移植性,同时增加库的大小和复杂性。如果您必须为要支持的每个操作系统重新编写大部分库,那么您可能做错了。请注意,这纯属猜测。您可以随时尝试在 Boost 邮件列表中询问。
  • 跨平台库的全部意义在于它用一个共同的抽象封装了在不同平台上不同的低级事物。那些低级的东西不同的事实是库的全部意义......例如,看看跨平台的 GUI 库。
  • @John 做了更多的挖掘,所以看看更新的答案。
  • 好消息。我想我一直认为 boost 是像 STL 这样的成品。
【解决方案2】:

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

【讨论】:

  • 不,我无法重写整个应用程序以使用新框架:)。
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 2010-12-05
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2014-12-17
相关资源
最近更新 更多