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

Posted IE06

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++系列11:openmp多线程编程相关的知识,希望对你有一定的参考价值。

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

1. 入门介绍

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

2. 语法解释

2.1 紧跟for

omp中的for指令用于告诉编译器,拆分接下来的for循环,并分别在不同的线程中运行不同的部分。如果for指令后没有紧接着for循环,编译器会报错。用法如下:
在这里插入图片描述
上面的代码其实等价于:
在这里插入图片描述

2.2 ordered指令

ordered指令用于控制一段代码在for循环中的执行顺序,它保证这段代码一定是按照for中的顺序依次执行的。
在这里插入图片描述
也就是说,在ordered这里会产生堵塞,保证流程按顺序执行。

2.3 sections指令

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

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

以上是关于C++系列11:openmp多线程编程的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS:具有多线程的本机 C++ 模块(openmp)

两种 C++ 多线程编程方式,看完不懂打我...

两种 C++ 多线程编程方式,看完不懂打我...

循环C ++中的分段错误Openmp

Visual C++ 只有一个线程工作 (OpenMP)

带继承的多线程 (C++)