C 为什么这个变量';的作用域设置为私有?

C 为什么这个变量';的作用域设置为私有?,c,parallel-processing,openmp,C,Parallel Processing,Openmp,我正在学习彼得·帕切科的书中的并行编程。在OpenMP一章中,我被一个简单的例子弄糊涂了,这个例子将奇偶转置排序转换为OpenMP 我可以理解这是如何工作的,以及指令是如何放置的,但我似乎无法理解为什么阶段的作用域设置为private 我正在粘贴这本书中自己编写的代码版本。函数签名是void omp\u transposition\u sort(double*list,int len) #pragma omp并行线程数(线程计数)\ 共享(列表,len)私有(i,阶段){ 用于(int相位=0;

我正在学习彼得·帕切科的书中的并行编程。在OpenMP一章中,我被一个简单的例子弄糊涂了,这个例子将奇偶转置排序转换为OpenMP

我可以理解这是如何工作的,以及指令是如何放置的,但我似乎无法理解为什么阶段的作用域设置为private

我正在粘贴这本书中自己编写的代码版本。函数签名是
void omp\u transposition\u sort(double*list,int len)

#pragma omp并行线程数(线程计数)\
共享(列表,len)私有(i,阶段){
用于(int相位=0;相位列表[i])
互换(列表,i-1,i);
}
}else{//奇数相位
#pragma omp for
对于(inti=1;i列表[i+1])
交换(列表,i,i+1)
}
}
}
}

当为每个唯一的阶段值调用
#pragma for
时,为什么作者认为需要显式地将阶段设置为私有变量?

没有读过这本书,这只是一个猜测,但在大多数并发编程中,共享状态是不好的,因此,私有化变量会减少人们对它的干扰。我猜测,目的是让每个线程都有一个自己的
阶段
变量用于偶数/奇数检查。如果作者从c89开始,其中并行循环计数器可能在并行之外定义,因为引用的方法是不允许的,private子句将确认这种情况下的特殊openmp默认值。每个线程都必须有不同的值以避免争用。@tim18但内部for循环是在连续检查阶段后调用的,它们不直接读/写阶段。相位由串行代码控制
#pragma omp parallel num_threads(thread_count) \
        shared(list, len) private(i, phase) {
        for(int phase = 0; phase < len, phase++) {
            if(phase % 2 == 0) {                    // even phase
                #pragma omp for
                for (int i = 1; i < len; ++i) {     // compare 0 with 1, 2 with 3
                    if (list[i - 1] > list[i]) 
                        swap(list, i - 1, i);
                }
            } else {                                // odd phase
                #pragma omp for
                for(int i = 1; i < len - 1; ++i) {  // compare 1 with 2, 3 with 4
                    if(list[i] > list[i + 1])
                        swap(list, i, i + 1)
                }
            }
        }
    }