根据我对 Boost.Interprocess 的有限经验,我没有遇到任何重大问题,但我无法真正评论性能。虽然它确实使用在程序文件夹之外创建的文件来完成它的工作,但它们都应该是内存映射的,这可以消除大多数性能问题。在任何情况下,当您使用 IPC 时,您应该总是期望一些额外的性能开销。
至于您强调的批评,可以删除先前进程留下的命名互斥锁或任何其他命名资源(请参阅静态remove(const char*)
函数)。公平地说,根据您的应用程序,正确使用可能会很棘手,这不是您在使用 Windows API 时必须处理的事情。另一方面,Windows API 不可移植。我的猜测是他们使用文件(即使存在更好的替代方案)来保持库的界面和行为在不同平台上保持一致。
无论如何,命名互斥体只是库提供的一小部分。更有用的特性之一是它为包括STL 分配器的共享内存区域提供了自己的内存管理器。我个人发现使用它提供的高级构造比使用原始内存更愉快。
更新:我在 Boost 文档中进行了更多挖掘,发现了各种有趣的花絮:
此页面提供了有关库的实现和性能的更多详细信息,但不包括实现原理。
这个链接清楚地表明他们的 Windows 互斥锁实现可以使用一些工作(1.46 版)。如果您在boost\interprocess\sync
文件夹中进一步挖掘,您会注意到另外两个名为posix
和的文件夹emulation
。这两个都包含同步原语的实现细节。posix 实现interprocess_mutex::lock
是您所期望的,但仿真实现非常基本:
// 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 邮件列表(我在文档中找不到任何内容)。