关键字"shared"阻止竞争条件吗?

Does the keyword "shared" prevent race conditions?

本文关键字:条件 竞争 shared 关键字      更新时间:2023-10-16

我不清楚"共享"在openMP中的作用。我看到规范声明shared"声明一个或多个列表项由任务共享…",但这对我来说似乎不太清楚。

例如,如果我有以下代码:

    #pragma omp parallel for shared(num1)
    for(i=0; i<m; i++) {
        for(j=0; j < n; j++) {
            if(myFunc(i,j) < 0) {
                num1 += 256*u(i,j);
            }
        }
    }

这将停止竞争条件与num1,并在这个for循环结束时给出一个准确的结果吗?如果不是,它到底是做什么的?

会停止竞争条件吗?

不,它不会:

确保多个线程正确访问共享变量(例如通过临界区)是程序员的责任

共享部分只是让同一个变量在多个线程中可见。

你可以使用临界区或者原子访问来进行同步,但是在这种情况下,你最好使用缩减子句:

#pragma omp parallel for reduction(+:num1)