我想知道我们需要在哪里设置临界区?
如果有多个线程共享一个数组,并且每个线程都想要 要写在不同的地方,是否需要在关键部分中,即使每个 线程写入数组中的不同位置?
假设我有二维数组 M[3][3]、initial_array[3] 和一些双变量 我想计算一些东西并将其存储在 M 的第一列中。 我可以与 for 循环一起使用,但我想与 openMP 一起使用,所以我这样做了:
omp_set_num_threads(3);
#pragma omp parallel shared(M,variable)
{
int id = omp_get_thread_num();
double init = initial_array[id]*variable;
M[id][0] = init;
}
它工作正常,但我知道它可能会导致死锁或运行时间过长。 我的意思是如果我有更多的线程甚至更大的 M.. 设置临界区的正确方法是什么? 我想问的另一件事是关于initial_array,它也需要共享吗?
最佳答案
这是安全的代码。
数组中的随机访问不会对数组中的其他元素造成任何竞争条件。只要您继续同时读取和写入数组中的非共享元素,就永远不会遇到竞争条件。
请记住,读取可能会与写入竞争,具体取决于元素的类型和大小。您的示例显示了double
,如果您在同一元素上进行了并发读取和写入操作,我会担心。写入期间可能会发生上下文切换,但这取决于您的架构/平台。不管怎样,你没有这样做,但值得一提。
关于c++ - openMP 关键部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415984/