标准互斥还是提升互斥?哪个更可取

  • 本文关键字:标准 c++ boost boost-mutex
  • 更新时间 :
  • 英文 :


std::互斥和boost::互斥之间的真正区别是什么?哪一个在实现和编译方面更快?它们都是便携式的吗?我阅读了与之相关的问题,但没有明确提及差异。stdmutex仅在c++11之后才受支持,因此较旧的编译器不支持它。旧的编译器是否支持boost互斥?如果最重要的条件要求代码是可移植的,那么应该优先选择什么?

作为默认选择,您应该更喜欢std::anything而不是boost::samething,因为它是标准库的一部分,因此更具可移植性,因为它不引入外部依赖性。

通常情况下,您无法真正比较std::mutexboost::mutex,因为没有一个且只有std::mutex,它的实现取决于您正在使用的标准库实现,该实现通常是工具链的一部分。

当你使用经验证据发现你使用的std::mutex在某些方面比boots::mutex"更糟糕"时,可能会出现这种情况。在这种情况下,切换到它可能是合理的,但前提是它确实合理,并且您有实际的证据(例如性能测量(。即便如此,这似乎也是最后的手段。如果可能的话,最好切换到不同的标准库实现或不同的工具链,或者升级当前的工具链。

将boost视为std特性原型的实验室。许多std设施最初是在boost上实现的。不同的是,std注重一致性和向前兼容性,而boost则瞄准了新的视野。没有什么能阻止boost在即将到来的版本中应用突破性的更改,但它也比std提供了更多问题的答案。我个人的偏好是std优先(如果可能(,boost其次(如果需要(。我通常会避开c++11之前的平台,除非我被迫面对。

@std::mutex每次对我来说,因为@Henri表示它(显然(是C++标准的一部分,所以你可以相信它在任何地方都可用。

另一方面,使用boost意味着您必须链接到boost库。虽然这是广泛可用的,并提供了许多方便的额外功能,但它相当重量级,你不会想仅仅为此而投入使用。

此外,std::mutex可能更快。boost的跨平台特性意味着依赖操作系统支持(包括互斥(的东西有时效率会降低。但这并不是我思考的主要因素。

但是,如果衡量绩效对你来说很重要,你应该运行自己的基准。你可以(大致(在Wandbox上完成这项工作——他们支持那里的boost库。

Boost的重点是尝试新技术和引入新功能。C++标准的重点是以可移植的方式(在大多数情况下(指定需求。boost的许多功能已经进入C++标准,但在过渡过程中经常发生很大变化——以提高可移植性,有时提高可靠性等。

如果您的实现(编译器和库(是C++11或更高版本,并且您不想移植到旧的实现,那么一定要使用std::mutex。它是2011年标准的一部分,因此更可取。无需依赖第三方库。只有当您需要C++标准不支持的boost的出血边缘功能时,您才需要boost(这意味着mutex以外的功能(。

以上的一些例外:boost的一些功能(包括与线程和互斥相关的功能(还没有进入C++标准,而C++标准中的一些功能则不在boost中。

如果您需要使用(或支持或端口到(较旧的实现,那么可以考虑使用boost::mutex。在大多数情况下,您需要使用您选择的实现单独安装boost版本(有些编译器版本附带了boost版本,但不依赖它(。如果没有一个版本的boost可以与您的编译器/库一起使用,那么(显而易见的是(您将无法使用boost::mutex

Boost从2001年末的1.25.0版本开始就拥有了线程库(包括mutex(。这表明,如果您的编译器不早于(粗略猜测(21世纪初,那么可以选择boost。

如果您需要支持一个比21世纪初更古老的实现,那么使用boost::mutex可能会运气不佳,需要求助于其他库/框架,或者编写操作系统特定的代码。

最新更新