在OpenMP线程中充分私有化数据

时间:2018-06-06 18:52:05

标签: c++ multithreading openmp

以下玩具代码没有任何用处,我知道:

#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;

}

但它说明了在处理真实代码时我脑海中浮现的一个问题。也就是说,我想知道tmp中的数组OtherClass:GetNumber。如何填充tmp的细节并不重要;我只是在制作一些代码来制作一些有趣的#34;数字在线程之间会有所不同。我的问题是,tmp是否能够充分保护可能正在运行的各种线程?在初始化,访问和删除线程时,线程是否可能会相互跳闸?例如,一个线程是否会访问另一个线程所定义的tmp?或者在另一个线程可以访问之前,一个线程是否可以删除tmp?有人可以告诉我如何修改代码,如果需要修改吗?

此代码顺便运行。但我想知道在更复杂,更大的代码中会发生什么。

1 个答案:

答案 0 :(得分:1)

您的代码非常安全。

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

那就是说 - 如果代码是真实代码的任何指示,我强烈建议少用delete / {{1}}并在堆栈上放置更多对象。它使得代码的推理变得更加容易 - 特别是涉及线程。