我正在使用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 ++编译器,代码将编译并运行。 当我搜索错误时,我已经发现了一些问题的答案。
然而,因为这是一个更大的项目,我想使用gcc编译器,因为链接的帖子已经有6年了。 今天有可能用gcc编译器编译这样的代码吗? 有人可以详细解释旧帖中提到的工作,因为我无法理解它吗?
感谢您的帮助!
答案 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的指针。