在linux上学习线程

Linux对我来说是一个新的平台。 我已经在Windows上用c ++编写了很多年,并且已经适应了该平台上的multithreading。

当我需要在Linux平台上学习c ++的时候,C ++ 11也随之而来。

Linux似乎大部分使用pthreads – 好的还有boost :: threads,QT也有自己的线程。 但是在C ++ 11中,std :: thread是一个全新的(跨平台和C ++标准)线程方式。

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

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

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

我看了一下pthread_join ,它似乎有一次只能在一个线程上等待的function。 我是否错过了另一个pthread调用?

std::threadboost::thread被C ++ 11接受的 。 我的理解是,如果boost::thread被代码替换为std::thread它仍然应该编译和工作。

boost::thread是基于pthreads设计的,提供了有关线程,互斥和条件变量的精简C ++封装。 虽然线程取消已经超出了C ++ 11的范围,因为在C ++中它没有达成一致。

所以,通过学习pthreads你也学习了std::thread概念。 std::threadpthreads C API的基础上增加了主要的语法糖和便利函数。

关于WaitForMultipleObjects()pthreadsstd::thread都不提供类似于它的bWaitAll=FALSE模式的任何东西,然而,它在UNIX上使用管道和select()进行常规模拟,或者在Linux上使用更现代的eventfd()epoll()bWaitAll=TRUE模式可以通过轮流等待所有任务来模拟,因为无论如何,直到所有对象都准备好,它才会继续。

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

这是我最近解释屏障同步的一个答案。

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

在posix平台上最接近的等效是等待多个文件描述符使用系统调用,如select()poll()或特定于Linux的epoll() ,但他们需要你有一个文件描述符等待,这是没有问题的对于I / O事件,但需要额外的工作才能使用它们等待互斥锁,条件变量或其他同步对象。 在这些系统调用之上建立了更多的通用事件库,例如libevent和libev和Boost ASIO ,它们支持等待定时器以及I / O,但是仍然没有线程完成,互斥锁等,只有一个函数WaitForMultipleObjects

你为pthread和C ++ 11线程所做的选择是分别等待不同的同步类型。 你可以等待定时器,等待线程完成,等待互斥量,等待条件变量,等待异步结果准备就绪(C ++ 11中的std::async ,在pthread中没有直接的等价物)…但是没有任何呼叫可以让你一次等待一组异类的数据。

我可以给你一个真正想法的答案,但唉,这是我学习的地方,这是一个很好的介绍:

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

您使用pthread_mutex_t进行同步,而pthread_join可能会处理等待多个任务的问题。 它的工作原理与您所期望的完全相同

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