在OpenMP中使静态类成员threadprivate

时间:2017-11-24 14:13:53

标签: c++ static openmp private

我正在使用C ++中的OpenMP,并尝试创建类threadprivate的静态成员变量。 一个非常简化的示例代码示例如下所示

#include <omp.h>
#include<iostream>

template<class numtype>
class A {
public:
    static numtype a;
    #pragma omp threadprivate(a)
};

template<class numtype>
numtype A<numtype>::a=1;

int main() {

 #pragma omp parallel
 {

  A<int>::a = omp_get_thread_num();

  #pragma omp critical
  {
    std::cout << A<int>::a << std::endl;
  }
 } /* end of parallel region */    
}

如果我尝试使用gcc编译器编译此代码,则会收到错误消息

threadprivatetest.cpp:8:27:错误:'a'尚未声明

#pragma omp threadprivate(a)

如果我使用英特尔C ++编译器,代码将编译并运行。 当我搜索错误时,我已经发现了一些问题的答案。

specification of new

然而,因为这是一个更大的项目,我想使用gcc编译器,因为链接的帖子已经有6年了。 今天有可能用gcc编译器编译这样的代码吗? 有人可以详细解释旧帖中提到的工作,因为我无法理解它吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

以下代码适用于我原本打算做的事情。

#include <omp.h>
#include<iostream>

template<class numtype>
class A {
public:
  static numtype* a;
  #pragma omp threadprivate(a)
};

template<class numtype>
numtype* A<numtype>::a=nullptr;

template class A<int>;

int main() {
  #pragma omp parallel
  {

    A<int>::a = new int;
    *A<int>::a = omp_get_thread_num();

    #pragma omp critical
    {
      std::cout << *A<int>::a << std::endl;
    }
  } /* end of parallel region */
}

正如您所看到的,区别在于a现在是指向numtype而不是numtype的指针。