关键字"shared"阻止竞争条件吗?
Does the keyword "shared" prevent race conditions?
我不清楚"共享"在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)
相关文章:
- compare_exchange C++函数如何确定竞争条件?
- 在C++中写入相同值的竞争条件?
- QByteArray 通过队列连接按值发出并连接并附加到竞争条件?
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- POSIX 条件变量和互斥体"竞争"
- 如何修复条件变量等待/通知的竞争条件
- 在没有互斥锁的情况下重新计数时如何避免竞争条件?
- 替代 rand() 以避免竞争条件?
- CUDA 内核中的竞争条件
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- 类声明自己(*this)为private以避免竞争条件/放弃在gcc中对threadprivate的请求
- 使用 gtest EXPECT_CALL 时竞争条件段错误,而另一个期望是执行相同的方法
- boost::进程间消息队列创建时的竞争条件
- 如何在没有竞争条件的情况下将 QFutureWatcher 与 QtConcurrent::run() 一起使用
- 为什么 printf 可以屏蔽竞争条件,而系统日志不能?
- 为什么这个代码会产生竞争条件
- 为什么 CUDA 同步点不能阻止竞争条件?
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 如何使用 Boost Atomic 删除竞争条件
- boost::mutex 无法帮助避免C++程序中的竞争条件