我想知道我们需要在哪里设置关键部分?
如果有多个线程具有一个共享数组,并且每个线程都想要
即使写在不同的地方,它是否也需要放在关键部分中
线程写入数组中的其他位置?
可以说我有二维数组M [3] [3],initial_array [3]和一些double变量
我想计算一些东西并将其存储在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/