std :: mutex和boost :: mutex之间的真正区别是什么?在实现和编译方面哪个更快?它们都是便携式的吗?我读了有关它的问题,但没有清楚地提及差异。仅从c ++ 11开始才支持std互斥锁,因此较早的编译器不支持它。较早的编译器是否支持boost互斥锁?如果最重要的条件要求代码具有可移植性,那么应该首选什么?
答案 0 :(得分:1)
作为默认选择,您应该更喜欢std :: 任何东西来增强:: samething ,因为它是标准库的一部分,因此更可移植,因为它不引入外部依赖性。
您通常无法真正比较std::mutex
和boost::mutex
,因为没有 one std::mutex
,它的实现取决于标准库的实现您通常使用的工具链中的一部分。
在某些情况下,当您使用经验证据发现正在使用的std::mutex
比boots::mutex
更糟时,可能会发生这种情况。在这种情况下,切换到可能是合理的,但前提是它确实是合理的,并且您有确凿的证据(例如性能评估)。即使那样,它似乎还是不得已。最好切换到其他标准库实现或其他工具链,或者在可能的情况下升级当前的工具链。
答案 1 :(得分:0)
@ std::mutex
每次对我来说都是如此,原因是@Henri指出它(显然)是C ++标准的一部分,因此您可以依靠它随处可见。
另一方面,使用boost意味着您必须链接到boost库。尽管此功能广泛可用,并提供了许多方便的额外功能,但它却是重量级的,您不希望仅为此添加它。
此外,std::mutex
可能更快。 Boost的跨平台性质意味着依赖OS支持的事物(可能包括互斥体)有时效率较低。但这不是我思考的主要因素。
但是,如果衡量性能对您很重要,则应该运行自己的基准测试。您可以在(例如)Wandbox上(大约)进行此操作-他们在那里支持boost库。
答案 2 :(得分:0)
可以考虑将Boost作为标准功能原型的实验室。许多std设施最初是在boost上实现的。不同之处在于std会照顾到一致性和前向兼容性,而boost则瞄准了新的视野。没有什么可以阻止boost在即将到来的版本中应用重大更改的,但是它提供的答案比std更多。我个人的喜好是在可能的情况下首先进行性病检查,然后在需要时进行性病检查。我通常避免使用c ++ 11之前的平台,除非被迫面对。
答案 3 :(得分:0)
Boost的重点是尝试新技术并引入新功能。 C ++标准的重点是以可以在大多数情况下实现的方式规定要求。 boost中的许多功能已进入C ++标准,但在此过渡过程中经常进行了很多更改-以提高可移植性,有时还提高可靠性等。
如果您的实现(编译器和库)是C ++ 11或更高版本,并且您打算不移植到较早的实现,则一定要使用std::mutex
。从2011年开始,它是标准的一部分,因此更可取。无需依赖第三方库。仅当您需要C ++标准不支持的尖端Boost功能(这意味着mutex
以外的功能)时,才需要Boost。
上述情况有一些例外:boost的某些功能(包括与线程和互斥锁相关的功能)尚未进入C ++标准,而C ++标准中的某些功能则没有增强。
>如果您需要使用(或支持或移植到)较旧的实现,请考虑使用boost::mutex
。在大多数情况下,您需要根据自己选择的实现分别安装boost版本,(某些编译器版本附带了boost版本,但不要依赖它)。如果没有适用于您的编译器/库的boost版本,那么(显而易见的是)您将无法使用boost::mutex
。
Boost的线程库(包括mutex
自大约1.25.0版本开始,该版本可追溯到2001年末。这表明如果编译器的年龄不早于(大概猜测)2000年代,则boost是一个选择。
如果您需要支持比2000年代早得多的实现,那么使用boost::mutex
可能会很不走运,并且需要使用其他库/框架或动手编写OS特定的代码。