首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >充分私有化OpenMP线程中的数据

充分私有化OpenMP线程中的数据
EN

Stack Overflow用户
提问于 2018-06-07 02:52:05
回答 1查看 26关注 0票数 0

据我所知,下面的玩具代码没有做任何有用的事情:

代码语言:javascript
复制
#include <iostream>

#include "omp.h"

using namespace std;

class OtherClass {

   public:

   OtherClass() {
      cout << "hi\n";
   }

   int GetNumber(int input) {
      int i, num;
      int *tmp;

      tmp = new int[100];

      tmp[0] = 0;
      for (i=1;i<100;i++) {
         tmp[i] = (input*tmp[i-1]+1)%5;
      }
      num = tmp[input];

      delete[] tmp;

      return num;
   }

   ~OtherClass() {
      cout << "bye\n";
   }

};


class MainClass {

   public:

   int *myarray;

   MainClass(int numcells) {
      myarray = new int[numcells];
   }

   ~MainClass() {
      delete[] myarray;
   }

};


int main() {

   int i;

#define NUMELEMS 100

   MainClass *mc = new MainClass(NUMELEMS);
   OtherClass *oc = new OtherClass();

#pragma omp parallel private(i)
   { 
#pragma omp for
   for (i=0; i<NUMELEMS; i++ ) {
      mc->myarray[i] = oc->GetNumber(omp_get_thread_num()+1);
   }
   } // end of omp parallel

   for (i=0; i<NUMELEMS; i++) {
      cout << mc->myarray[i] << "\n";
   }

   delete mc;
   delete oc;

}

但它说明了我在处理真实代码时脑海中出现的一个问题。也就是说,我想知道OtherClass:GetNumber中的数组tmptmp如何填充的细节并不重要;我只是放了一些代码来生成一些“有趣的”数字,这些数字会因线程而异。我的问题是,tmp是否针对可能正在运行的各种线程提供了足够的保护?有没有可能线程在初始化、访问和删除它时会被彼此绊倒?例如,一个线程会访问另一个线程定义的tmp吗?或者,一个线程会在另一个线程访问tmp之前删除它吗?谁能告诉我,如果需要修改,我应该如何修改代码?

顺便说一句,这段代码运行得很好。但我想知道在更复杂、更大的代码中会发生什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 05:50:33

你的代码是完全安全的。

GetNumber中发生的任何事情对于一个线程来说都是完全局部的,没有变量或指针可以转义。准确地说,变量tmp是每个线程的私有变量--其他线程看不到它。因此,由每个线程分配的tmp指向的数据对任何其他线程都是不可见的。

也就是说-如果代码是真实代码的任何指示,我强烈建议使用更少的new / delete,并在堆栈上放置更多的对象。它使得关于代码的推理变得容易得多--尤其是涉及到线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50727589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档