Boost.Thread 还是只是::thread?

Posted

技术标签:

【中文标题】Boost.Thread 还是只是::thread?【英文标题】:Boost.Thread or just::thread? 【发布时间】:2010-08-24 09:40:25 【问题描述】:

我还不是 Boost 用户。然而,我计划尽快进入它。 但是我不太关心 Boost,以及未来可能与即将到来的 C++0x 的名称冲突或差异。 (也许这不是一个真正的问题,但例如我发现 boost lambdas 语法非常丑陋,BOOST_FOREACH 对眼睛有侵略性,以及其他仅审美的个人观点)。

我对 TR2 非常感兴趣,它似乎是由库 Boost.Thread 和 just::thread 实现的。两者似乎都是由 Anthony Williams 编写和维护的。

但 just::thread 声称严格遵守 TR2。

我想知道你们中是否有人会指示我使用其中一种。 just::thread 不是免费的,但如果真的像 TR2 一样,我很想。

有什么想法吗?

【问题讨论】:

【参考方案1】:

目前,我正在 Linux 上尝试使用 boost、just::thread 库和 gcc g++ 4.5 编译器的所谓“实验性”C++Ox 特性。关于线程,我发现我为 just::thread 编写的代码和 g++ 编译器是 100% 兼容的。 boost 库 (1.43) 明显与前两者不兼容。但是,对于我的生产代码,我使用 boost 库。

名称冲突不应该成为正确和明智地使用 boost、just::thread 和 g++ 编译器中可用命名空间的问题。使用带有 C++Ox g++ 功能的 just::thread 没有问题;确实,just::thread 建议使用这些功能,例如可变参数模板。

【讨论】:

“boost 库 (1.43) 与前两者明显不兼容”是什么意思。你说的是哪种兼容性? @Stephane: '我为 just::thread 和 g++ 编译器编写的代码 100% 兼容';代码兼容的意思是,在 C++Ox 下为 just::thread 成功编译和链接的代码将仅使用 C++Ox g++ 4.5 成功编译和链接而无需修改。我无法实现与 boost 库的这种兼容性。 @thanx Sam。我还在犹豫,但这对 just::thread 来说是个好点。【参考方案2】:

我认为现在说图书馆“就像 TR2”还为时过早。 TR2 将在 C++0x 之后发布,而C++0x 本身甚至还没有发布。

不过,Boost.Thread 库也声称跟随标准化委员会的发展。

我更喜欢任何 Boost 库而不是其“原始”库,因为 Boost 致力于高质量,并且 Boost 社区协作维护库,而不是碰巧迁移到 Boost 的私有库。

您不必担心名称冲突,因为当前位于 boost:: 命名空间中的内容将保留在命名空间中,并且所有 TR2 内容都可能转到 std::tr2::

【讨论】:

【参考方案3】:

目前最好的建议 - 以上都不是:-)

除非您有绝对迫切的需求,否则您只需等待 C++0x 先稳定下来(大约需要 2 年),就可以为自己节省大量时间和烦恼。如果有人要你去追逐移动的目标 - 要求先看看钱:-) 和一个大保留者:-))

与许多其他情况一样,最好先问问自己“我的实际需求是什么”?如果是学习多线程开发,那么花时间学习 C# 或 Java 会更轻松。如果您需要开始开发生产级系统,那么您已经知道您的目标平台,并且您能做的最好的事情就是坚持在目标平台上使用久经考验的多线程库并提供完整的调试器支持.再说一遍 - 完整的调试器支持和集成决定了你在线程领域的生活质量。

如果您触摸 Boost,请确保您有足够的时间来确保它不依赖于其他十几个 boost-something 文件,然后是另外十几个...除非您是这样的爱好者 :-) 如果您touch a libraty 声称自动解锁检测已准备好支付 CPU 周期费用并处理可能不需要的干扰。

【讨论】:

以上是关于Boost.Thread 还是只是::thread?的主要内容,如果未能解决你的问题,请参考以下文章

boost thread:对象被释放后修改

Boost.Thread 链接 - boost_thread 与 boost_thread-mt

boost::thread & 成员函数

如何将参数传递给 boost::thread?

boost::this_thread::interruption_point() 不会抛出 boost::thread_interrupted& 异常

OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?