4

Linux 对我来说是一个新平台。我已经用 C++ 在 Windows 上编码多年,并且已经习惯了该平台上的多线程。

当我需要在 linux 平台上学习 c++ 时,C++11 出现了。

Linux 似乎在大多数情况下使用 pthreads - 好吧还有 boost::threads 和 QT 也有自己的线程。但是随着 C++11 的出现,std::thread 是一种全新的(跨平台和 C++ 标准)处理线程的方法。

所以我想我必须学习 pthreads 和 std::threads。最终,std::thread 似乎更重要,但是那里有很多遗留代码,所以我必须知道两者。

对于 Windows 上的线程同步,我会使用WaitForMultipleObjects来等待一些任务完成,然后再继续进一步的工作。

pthread 是否存在类似的同步机制?标准::线程?

我看过pthread_join,它似乎可以一次只等待一个线程。我是否错过了另一个 pthread 调用?

4

5 回答 5

8

std::threadboost::threadC++11 接受,并带有一些附加功能。我的理解是,如果boost::thread在代码中被替换为std::thread它应该仍然可以编译和工作。

boost::thread基于pthreads设计,在线程、互斥体和条件变量上提供精简的 C++ 包装器。线程取消虽然不在 C++11 的范围之内,因为在 C++ 中它应该如何工作没有达成一致。

因此,通过学习,pthreads您还可以学习std::thread概念。在C APIstd::thread之上添加了大部分语法糖和便利功能。pthreads

关于WaitForMultipleObjects(),既不pthreads也不std::thread提供与其bWaitAll=FALSE模式类似的任何东西,但是,它通常使用管道和select()在 UNIX 上进行模拟,或者更现代eventfd()epoll()在 Linux 上进行模拟。bWaitAll=TRUE可以通过依次等待所有任务来模拟模式,因为它在所有对象都准备好之前不会继续。

于 2012-05-30T14:36:25.273 回答
1

不,pthreads 和 C++11 都没有直接等价于WaitForMultipleObjects(即等待任何可等待的“句柄”类型。) pthread_join只能用于连接线程,并且只能用于单个特定线程。

在 posix 平台上最接近的等价物是使用系统调用来等待多个文件描述符,例如select(),poll()或 linux-specific epoll(),但它们要求您有一个文件描述符来等待,这对于 I/O 事件来说很好,但需要额外的工作您可以使用它们等待互斥锁、条件变量或其他同步对象。在这些系统调用之上构建了更通用的事件库,例如libeventlibevBoost ASIO,它们支持等待计时器以及 I/O,但仍然不支持线程完成、互斥锁等,只有一个函数,比如WaitForMultipleObjects

The alternatives you do have for pthreads and C++11 threads are to wait on different synchronisation types separately. You can wait for timers, wait for threads to complete, wait for mutexes, wait on condition variables, wait for asynchronous results to be ready (std::async in C++11, no direct equivalent in pthreads) ... but there's no call that will allow you to wait a heterogeneous set of those types all at once.

于 2012-05-30T14:43:44.200 回答
0

我可以给你一个非常花哨的答案,但是唉,这是我学习它们的地方,这是一个很好的介绍:

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

pthread_mutex_t用于同步并pthread_join可能处理等待多个任务的问题。它完全按照您的预期工作。

于 2012-05-30T14:34:31.677 回答
0

关于WaitForMultipleObjects,这通常称为屏障同步。Boost 有一个称为屏障的实现。它使用条件变量来实现它,在 posix 它的一个pthread_cond_t

是我最近留下的解释屏障同步的答案。

于 2012-05-30T14:35:16.357 回答
0

基于,您必须pthread_join为您创建的每个线程调用。或者使用互斥锁,如果需要同步你的线程。

于 2012-05-30T14:38:08.457 回答