利用threadprivate在子函数间共享全局变量

多个并行域之间,或者并行域内部的函数调用之间如果需要在线程内部共享全局变量,必须用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;
}