C++系列11:openmp多线程编程

我们在系列6里面已经说了多线程(使用std::thread库),然而项目里面竟然还用到了openmp,不得已只能看下。

1. 入门介绍

openmp是由一系列#paragma指令组成,这些指令控制如何多线程的执行程序。另外,即使编译器不支持omp,程序也也能够正常运行,只是程序不会多线程并行运行。
首先要在cmake中添加上openmp,cmake3.9之后内置了openmp,按照下述语句写即可:
C++系列11:openmp多线程编程_第1张图片
然后看一个简单例子:
C++系列11:openmp多线程编程_第2张图片

2. 语法解释

2.1 紧跟for

omp中的for指令用于告诉编译器,拆分接下来的for循环,并分别在不同的线程中运行不同的部分。如果for指令后没有紧接着for循环,编译器会报错。用法如下:
C++系列11:openmp多线程编程_第3张图片
上面的代码其实等价于:
C++系列11:openmp多线程编程_第4张图片

2.2 ordered指令

ordered指令用于控制一段代码在for循环中的执行顺序,它保证这段代码一定是按照for中的顺序依次执行的。
C++系列11:openmp多线程编程_第5张图片
也就是说,在ordered这里会产生堵塞,保证流程按顺序执行。

2.3 sections指令

section指令用于指定哪些程序块可以并行运行。一个section块内的代码必须串行运行,而section块之间是可以并行运行的。如,

#pragma omp parallel sections
{
{ Work1();}
#pragma omp section
{ Work2();
  Work3();}
#pragma omp section
{ Work4();}
}

你可能感兴趣的:(C++系列)