C语言 在 Visual Studio 中使用 threadprivate 指令



Visual Studio 2010中的OpenMP实现似乎有一个严重的错误,不允许将外部变量作为threadprivate。以下代码无法编译:

文件.c


#include <omp.h>
/* Declaration of external variable. */
extern int My_Var;
#pragma omp threadprivate (My_Var) 
void MyFunc(void) { My_Var = 1;}

错误消息是:

error C3053:
'My_Var' : 'threadprivate' is only valid for global or static data tems.

显然,编译器对变量的链接属性感到困惑。

最常见的是在多个文件中引用全局变量。因此,这个问题使得threadprivate指令在任何实际程序中都无法使用。

我想知道是否有处理此错误的技巧。不幸的是,就我而言,这个问题阻止了我完全使用 OMP。

谢谢

亚历克斯

似乎是(又一次)违反了VC++编译器中的OpenMP标准。幸运的是,VC++ 中的 threadprivate 子句直接作为 thread __declspec 属性的应用实现,您可以简单地替换:

extern int My_Var;
#pragma omp threadprivate (My_Var)

extern __declspec(thread) int My_Var;

您仍然必须提供相同的__declspec(thread)属性(或#pragma omp threadprivate编译指示)以在声明该属性的所有翻译单元中My_Var(这也是 OpenMP 规范 - "OpenMP 2.0"规范的第 2.7.1 节的要求)。

最新更新