c – OpenMP,MPI,POSIX线程,std :: thread,boost :: thread如何关联?

前端之家收集整理的这篇文章主要介绍了c – OpenMP,MPI,POSIX线程,std :: thread,boost :: thread如何关联?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有几种方法可以实现多线程. std :: thread最终由C 11标准引入,但boost :: thread可以有效地使用.每种技术都有特定的语法和内容,但是 – 粗略地 – 用于cpu并行编程.但它们有不同的效果.我知道,例如,MPI和OpenMP用于不同的内存模型.

我也知道技术的选择实际上并不是唯一的,因此可以使用另一种技术(再次,MPI和OpenMP).为什么它们被用于不同的效果但仍然使用相同的源(cpu)?

如果我根据每种技术编译一个具有并行性的C程序,那么(从操作系统和硬件的角度来看)会有什么不同?例如,OpenMP或std :: thread是否使用POSIX线程?如果是这样,C 11的线程如何在Windows上运行?或者这些技术中的每一种都通过汇编语言直接与cpu协同工作?

解决方法

OS提供线程(syscalls用于创建新线程;调度服务).

Unix libc包含了许多有用功能的OS线程包(如互斥锁,cond vars等).通常这种系统库的外部接口是“POSIX线程”(函数名为pthread_ *):http://en.wikipedia.org/wiki/POSIX_Threads

Windows有自己的难以使用的线程API(WINAPI的CreateThread等).但是有一些围绕Windows API的包装器可以获得类似POSIX线程api的东西(例如mingw32和cygwin有这样的库;检查wikipedia section)

C 11 std :: thread,boost的boost :: thread只是围绕系统线程API的现代OS独立包装器.它们用于创建可在任何支持的平台上编译的可移植程序,而无需创建#ifdef地狱和/或围绕系统线程库编写自己的自定义包装器.如果您正在创建新程序,请考虑使用这种方式.

还有其他几种穿线包装纸,例如包含在QT或GTK等图形库中.

OpenMP实现具有内部支持库(例如,gcc具有libgomp),其使用系统/ libc线程API,例如libgomp使用POSIX线程.一些实现还可以包括经由组件的用户空间线程切换(M:N线程模型).

MPI里面没有线程库. MPI用于创建多个进程并在它们之间建立通信.但是当MPI用于多线程程序时,它将使用一些线程API来进行同步.例如,MPICH将在unix上使用pthread.

猜你在找的C&C++相关文章