1

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

4

4 回答 4

2

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

您无法真正进行比较std::mutexboost::mutex一般来说,因为没有唯一 std::mutex,它的实现取决于您使用的标准库实现,这通常是工具链的一部分。

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

于 2018-07-13T08:00:49.997 回答
1

考虑将 boost 作为原型设计标准特性的实验室。许多标准设施最初是在 boost 上实现的。不同之处在于 std 负责一致性和前向兼容性,而 boost 则针对新的视野。没有什么能阻止 boost 在即将到来的版本中应用重大更改,但它也提供了比 std.js 更多问题的答案。我个人的偏好是先 std - 如果可能的话 - 然后在需要时提升。我一般会避开 pre c++11 平台,除非我被迫面对。

于 2018-07-13T08:26:52.373 回答
0

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

如果您的实现(编译器和库)是 C++11 或更高版本,并且您不打算移植到较旧的实现,那么一定要使用std::mutex. 它是 2011 年标准的一部分,因此更可取。无需依赖第三方库。如果您需要 C++ 标准不支持的最前沿的 boost 特性(这意味着除mutex.

上述情况的一些例外情况:boost 的一些特性(包括与线程和互斥锁相关的)尚未进入 C++ 标准,而 C++ 标准中的一些特性不在 boost 中。

如果您需要使用(或支持或移植到)较旧的实现,请考虑使用boost::mutex. 在大多数情况下,您需要使用您选择的实现单独安装一个 boost 版本(一些编译器版本附带了一个 boost 版本,但不要依赖它)。如果没有适用于您的编译器/库的 boost 版本,那么(很明显)您将无法使用boost::mutex.

mutexBoost从 2001 年末的 1.25.0 版本开始就拥有线程库(包括)。这表明如果您的编译器不早于(粗略猜测)2000 年代初期,则可以选择 boost。

如果您需要支持比 2000 年代早期更早的实现,那么使用boost::mutex.

于 2018-07-13T11:00:01.687 回答
0

@std::mutex对我来说,因为@Henri 声明它(显然)是 C++ 标准的一部分,所以你可以依赖它在任何地方都可用。

另一方面,使用 boost 意味着您必须链接到 boost 库。虽然它被广泛使用并提供了许多方便的额外功能,但它非常重量级,你不想仅仅为了这个而把它拉进去。

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

但是,如果衡量性能对您很重要,您应该运行自己的基准测试。您可以(大致)在(比如说)Wandbox上执行此操作- 他们支持那里的 boost 库。

于 2018-07-13T08:05:41.397 回答