多个并行域之间,或者并行域内部的函数调用之间如果需要在线程内部共享全局变量,必须用threadprivate。如果不将全局变量声明为threadprivate而是声明为private,则在子函数调用时子函数内的全局变量传递不到子函数外面。
比如下面程序:
float global_a,global_b #pragma omp threadprivate(global_a) main() {.... #pragma omp parallel for private(i,inner_var) shared(global_b) for(i=0;i<100;i++) { sub_fun1(i); printf(....);//如果global_a 不用threadprivate而用private,在这里打印 global_a得到的结果会是0, sub_fun2(i);//并且sub_fun2内用的global_a初值也是0,即没有从sub1里面共享过来。 printf(...);//global_b是共享变量,这里可以打出来。 } } sub_fun1() { do_some_thing on global_a using i; printf(a);//如果a是private而非threadprivate,则这里可以打出来,但外面打不出来 #pragma omp critical do_some_thing else on global_b; } sub_fun2() { do_some_other_thing on global_a using i; }
此外,对于大型程序,通常习惯于将全局变量的定义放到一个单独的文件中,并将它们的原型声明放进一个头文件,同时在每个用到这些变量的文件中include进该头文件。这时如果要声明变量的threadprivate属性,也应该放在头文件中声明而不是定义时声明,以便每个用到该全局变量的文件都知道它是个threadprivate变量。
评论