c ++ omp原子捕获 - 语法?

时间:2012-08-07 16:35:24

标签: c++ openmp

非常简单的代码,无法理解为什么编译器会抛出有关我使用omp atomic capture

的错误

// my_class.h

class my_class
{

my_class()
{ }

static int class_int;
static int get_next_int();

};

// my_class.cpp

int my_class::get_next_int()
{
   int next_int;
  #pragma omp atomic capture
  next_int = class_int++;

  return next_int;
}

编译错误:

my_class.cpp: In static member function 'static int 
my_class::get_next_int()':

my_class.cpp:2069: error: expected end of line before 'capture'
my_class.cpp:2070: error: invalid operator for '#pragma omp atomic' before '=' token

它可能与static有关吗?我无法想象为什么......

如果我使用pragma omp critical代替,那么它工作正常(没有编译器错误)。

PS我在所有.h和.cpp中都有#include <omp.h>。我像往常一样用-fopenmp链接

2 个答案:

答案 0 :(得分:4)

OpenMP 3.1中引入了capture子句。您需要一个兼容的编译器:

  • 自v4.7以来的GCC
  • 自v10.1以来的英特尔编译器
  • 自v12.3以来的Oracle Solaris Studio
  • 许多other compilers除了......
  • MSVC(所有版本,包括2012),不支持高于2.0的OpenMP版本。

GCC 4.4.5不支持OpenMP 3.1。它只支持OpenMP 3.0。

答案 1 :(得分:0)

如果您使用的是Microsoft编译器,则它不支持omp atomic指令的clauses

将代码更改为#pragma omp atomic,根据ms文档,编译器会做正确的事情。让我持怀疑态度。 :)