从我有限的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
文件夹中进一步挖掘,您会注意到另外两个名为posix
和emulation
的文件夹。这两个都包含同步原语的实现细节。为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邮件列表(我在文档中找不到任何东西)。
缺少您需要的功能?如果答案是没有,我不明白为什么你需要担心其他人可能不会分享你的需求的“批评”... – Nim
他们究竟批评什么?你能提供链接吗?就像这样,问题太模糊 –
这不是特征,而是被批评的实现。我不明白这个问题是如何模糊的......如果Boost的实现存在问题,那么分享它们,如果有更好的库,请列出它们。 –