有多种方法可以实现多线程。 std::thread
最终由C ++ 11标准提出,但可以有效地使用boost::thread
。每种技术都有特定的语法和内容,但是 - 粗略地 - 用于CPU并行编程。但它们有不同的效果。我知道,例如,MPI和OpenMP用于不同的内存模型。
我也知道技术的选择实际上并不是唯一的,因此可以使用另一种技术(同样,MPI和OpenMP)。为什么它们被用于不同的效果但仍然使用相同的源(CPU)?
如果我根据每种技术编译具有并行性的C ++程序,那么(从操作系统和硬件的角度来看)会有什么不同?例如,OpenMP或std::thread
是否使用POSIX线程?如果是这样,C ++ 11的线程如何在Windows上运行?或者这些技术中的每一种都是通过汇编语言直接与CPU协同工作吗?
答案 0 :(得分:9)
OS提供线程(系统调用来创建新线程;调度服务)。
Unix libc包含了许多有用功能的OS线程包(如互斥锁,cond vars等)。通常这种系统库的外部接口是" POSIX线程" (名为pthread_*
的函数):http://en.wikipedia.org/wiki/POSIX_Threads
Windows有自己难以使用的线程API(WINAPI' s CreateThread
等)。但是有一些围绕Windows API的包装器可以获得类似POSIX线程api的东西(例如mingw32和cygwin有这样的库;检查wikipedia section)
C ++ 11 std::thread
,boost' s boost::thread
只是围绕系统线程API的现代OS独立包装器。它们用于创建可在任何支持的平台上编译的可移植程序,而无需创建#ifdef
地狱和/或围绕系统线程库编写自己的自定义包装器。如果您正在创建新程序,请考虑使用这种方式。
还有其他几种线程封装器,例如包含在QT或GTK +等图形库中。
OpenMP实现具有内部支持库(例如,gcc具有libgomp),它使用系统/ libc线程API,例如libgomp使用POSIX线程。一些实现还可以包括通过汇编的用户空间线程切换(M:N线程模型)。
MPI里面没有线程库。 MPI用于创建多个进程并在它们之间建立通信。但是当MPI用于多线程程序时,它将使用一些线程API来进行同步。例如,MPICH将在unix上使用pthread。