在Visual Studio中使用threadprivate指令

时间:2012-09-24 06:59:25

标签: c multithreading visual-studio-2010 openmp extern

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

file.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指令在任何现实程序中都无法使用。

我想知道是否有处理这个bug的技巧。不幸的是,在我的情况下,这个问题阻止我完全使用OMP。

谢谢,

亚历

1 个答案:

答案 0 :(得分:3)

这似乎是(又一次)违反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 pragma)(根据OpenMP规范也是必需的 - 部分2.7.1“OpenMP 2.0”规范)。