【问题标题】:Using threadprivate directive in Visual Studio在 Visual Studio 中使用 threadprivate 指令
【发布时间】:2012-09-24 06:59:24
【问题描述】:

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。

谢谢,

亚历克斯

【问题讨论】:

  • 你试过用/openmp /LD编译吗?

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


【解决方案1】:

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

extern int My_Var;

#pragma omp threadprivate (My_Var)

extern __declspec(thread) int My_Var;

您仍然必须在声明它的所有翻译单元中为 My_Var 提供相同的 __declspec(thread) 属性(或 #pragma omp threadprivate 杂注)(根据 OpenMP 规范 - “ OpenMP 2.0" 规范)。

【讨论】:

  • 我刚刚使用了 extern __declspec(thread) int My_Var;正如建议的那样,一切都编译得很好。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2013-01-28
  • 2010-12-01
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多