使用pThreads在线程之间共享3D数组

时间:2013-03-31 10:25:47

标签: c++ c parallel-processing pthreads

我是并行编程的新手,我正在尝试使用pThreads并行化应用程序。我有一个功能,可以浏览3D数组,计算一些东西并将结果存储到另一个3D数组中。该函数通过两个for循环遍历数组(第三个维度为2)。

我的想法是在不同的线程之间共享周围的for循环(使用i索引)。这是我要并行化的函数:

#define MAX_X 100
#define MAX_Y 100

void serialFunction(float v1[MAX_X][MAX_Y][2], float v2[MAX_X][MAX_Y][2]) {
     int i,j;
     for(i=0;i<MAX_X;i++) {
         for(j=0;j<MAX_Y;j++) {
            v2[i][j][0] = 2*v1[i][j][1];
            v2[i][j][1] = -3*v1[i][j][0];
         }
     }
}

我试图做出这些改变:

struct thread_data {
  int start;
  int end;
  float ***v1;
  float ***v2;
};


void serialFunction(float v1[MAX_X][MAX_Y][2], float v2[MAX_X][MAX_Y][2]) {
   int t;
   pthread_t threads[NB_CPUS];
   int startBoundaries[NB_CPUS], endBoundaries[NB_CPUS];
   struct thread_data data[NB_CPUS];
   computeBoundaries(startBoundaries, endBoundaries);
   for(t=0;t<NB_CPUS;t++) {
      data[t].start = startBoundaries[t];
      data[t].end = endBoundaries[t];
      data[t].v1 = (float***)v1;
      data[t].v2 = (float***)v2;
      pthread_create(&threads[t], NULL, threadedFunction, (void*)&data[t]);
   }
}



void *threadedFunction(void *threadArg) {
   struct thread_data *data = (struct thread_data*)threadArg;
   float ***v1 = data->v1;
   float ***v2 = data->v2;
   int i,j;

   for(i=data->start;i<data->end;i++) {
      for(j=0;j<PIC_Y;j++) {
         v2[i][j][0] = 2*v1[i][j][1];
         v2[i][j][1] = -3*v1[i][j][0];
   }
}

问题在于,当我运行代码时,每次threadedFunction尝试访问v1的元素时都会出现分段错误。它表现得好像v1不会被分配,我不明白为什么。即使serialFunction尚未达到目的,也会发生这种情况。

约束是我无法更改serialFunction签名,我必须使用pThreads。

任何人都可以解释我的错误吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

传递给线程的数据是为函数serialFunction()创建的本地/自动数据。您将指向此数据的指针作为参数传递给线程函数。当函数退出时,不保证数据存在。请注意,代码中没有任何内容可以阻止serialFunction()在 之前退出 ,在线程函数threadedFunction()中访问数据。如果serialFunction()在通过threadedFunction()中的指针访问数据之前退出,则会得到未定义的行为以及您现在遇到的情况。

解决方案是:

  • 使用serialFunction()
  • 之类的内容延迟退出功能pthread_join
  • 在静态/全局/动态存储上分配数据,以将其生命周期从函数范围中分离出来。