c++ - openMP 关键部分

标签 c++ multithreading critical-section openmp

我想知道我们需要在哪里设置临界区?

如果有多个线程共享一个数组,并且每个线程都想要 要写在不同的地方,是否需要在关键部分中,即使每个 线程写入数组中的不同位置?

假设我有二维数组 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/

相关文章:

Java为每个数据库行创建唯一的线程

c++ - 如果 MessageBox()/related 是同步的,为什么我的消息循环不卡住?

c++ - DLL 和应用程序之间的互斥锁共享

Delphi TCriticalSection Acquire vs Enter - 有什么区别?

c++ - 带有 CRITICAL_SECTION 的模板类编译但在使用时出现错误

c++ - OpenMP:一次为线程分配一个迭代

c++ - 根据std::is_same中的枚举值检查模板参数

c++ - 使用 ofstream 写入带有临时缓冲区的文件

c++ - std::make_from_tuple 在没有构造函数的情况下无法编译

c - 事件未使用 ResetEvent() 重置