我应该使用std::thread还是Boost线程?

15

我是一名C#程序员,现在开始写多线程的C++应用程序,想知道使用什么更好: std::thread 还是它的Boost对应物?

我看到了另一个Stack Overflow帖子中的讨论,但仍然不完全清楚为什么应该选择其中之一。如果不是要开始一个新程序,我应该使用标准库还是Boost线程?

谢谢!


我相信std::thread的实现是基于boost::thread的实现,因此不应该有太大的差异。 - Brady
boost::threadstd::thread非常不同。它们不能互换使用。boost::thread是几年前设计的,因此显得有些陈旧。 - Pete Becker
嗨,你应该提到你是否使用VS(如果是的话,是2010还是2012)... 顺便说一下,你可能想读一下这篇文章:http://akrzemi1.wordpress.com/2012/11/14/not-using-stdthread/ - NoSenseEtAl
3个回答

18

如果您的项目尚未使用boost,那么没有理由使用boost::thread而不是std::thread。除非您在使用一些STL中没有的boost功能。std::thread对于大多数用例已经足够合适,除非有强有力的论据证明,编写标准代码总是更可取的。

但是,如果您的项目已经使用了boost,请检查boost::thread是否提供了与std::thread相比的任何额外功能。


2
我发现一个更喜欢使用编译器标准库版本而不是Boost版本的原因是,编译器标准库可以根据平台进行更多优化,而Boost必须兼容许多平台和供应商。一个例子就是shared_ptr<>-- Boost使用了大量头文件,而Visual Studio 2008只需要少量头文件,我们切换到它后,对构建时间产生了明显积极的影响。 - the_mandrill
1
你的意思是std::thread不会增加二进制文件的大小吗?恐怕这个假设是不正确的。 - Igor R.
@IgorR. 确实如你所说,我已经从我的答案中删除了这个声明,因为它是误导性的。 - EddieBytes
@the_mandrill 注意,在VS2008中,shared_ptr存在缺陷且实现非常糟糕!下面的代码(符合标准)会在那里崩溃:结构体a { a():p_(this,mem_fn(&a::delete_me)) {} void reset() { p_.reset(); } void delete_me() { delete this; }shared_ptr<a> p_; };int main() { a *p = new a; p->reset(); } - Igor R.
好的,我自己从未遇到过这方面的问题。但我认为我的观点仍然站得住脚。我并不一定是在谈论增加二进制文件大小,只是使用编译器标准库而非更可移植的实现(如 boost )可能会带来一些好处(例如编译时间、性能)。 - the_mandrill

3

请记住,Boost.Thread是一个可移植的库,并且可以在广泛的平台/编译器上进行编译,包括那些不支持std::thread的平台。


0

这真的取决于您的习惯和偏好。使用 Boost,您可以拥有一整套使生活更轻松的库,但需要在编译程序的系统上安装它们,而使用 std 线程只需要一个 cpp 编译器。


7
使用 std::thread 需要一个支持 C++11 的编译器。目前所有所谓的 C++11 编译器都是部分完成并且在不断改变,因此使用这种编译器并不一定易如反掌。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接