PThread与boost::thread有何区别?

23

过去没有使用过线程技术的话,对于初学者来说,在C++中哪种线程技术会更容易掌握?是boost::thread还是pthreads?


我还没有使用过两者中的任何一个,但我查看了它们的文档。Boost更兼容,但pthread更容易开始使用。 - Shawn Buckley
有用的链接:http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/overview/networking/bsd_sockets.html - Jared Burrows
5个回答

38

我将与其他人走相反的路线 - 学习(或至少熟悉)pthreads。由于boost主要只是在posix平台上对pthread进行包装,因此了解底层运行情况有所帮助。为了实现通用性,boost将特定于平台的功能留给开发者自己实现。如果要使用native_handle()调用,则需要了解平台提供了什么。

可以将其类比为sockets。有许多socket类和框架。但它们最终都包装了底层平台的socket API。通过了解底层技术,你的理解会更加深入,并能知道你的类抽象可能存在哪些缺陷。


3
你无法通过Boost访问哪些特定功能? - jalf
5
pthread属性 - 优先级等。您可以通过Thread、Mutex等的native_handle()调用来获取它们,但如果您对pthread不太了解,您可能永远不会知道它们是否存在。 - Duck
1
说得好。只是希望你在帖子中提到它们。 我还想说,大多数应用程序不应该担心线程优先级(或进程优先级)。但你是对的,如果需要这些细节,熟悉底层API是必不可少的。 - jalf

35

选择boost::thread。它与即将到来的C++标准线程密切相关(链接1),接口非常易于使用且符合C++的惯用法(链接2)(采用RAII而非手动资源管理)。


9

boost::thread是一个非常好的、可移植的抽象层。我肯定会使用它,但也要学习本地线程API,比如pthread,这样你就知道在你的平台上线程是如何工作的。


6
Boost.Thread使用RAII概念进行锁定,这使得异常更加安全,并有助于避免像忘记释放互斥锁这样的错误。

2

我认为它们的难度相当接近。唯一的大区别是PThreads得到了广泛支持(如果您关心跨平台移植)。另一个区别是,已经有相当多的关于PThreads的好书籍,虽然几乎所有概念都可以转换成boost::thread和许多其他线程库。


1
pthread默认情况下仅在nix平台上可用(在Sourceforge上有一个Windows的pthreads包装器)。Boost是跨平台的,在nix和Windows上都受支持。 - jalf
3
Microsoft提供了包含pthread头文件和库的“Services for Unix”软件包。对于Win2K/XP/2003,需要从以下网址下载: http://www.microsoft.com/downloads/details.aspx?FamilyID=896C9688-601B-44F1-81A4-02878FF11778 而对于Vista/7/2008,则为内置功能: http://technet.microsoft.com/en-us/library/cc771672.aspx - Chris S

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