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 节的要求)。