2

2D 配列で並列計算を実行するために複数のスレッドを取得しようとしています。ユーザーは、25*25 の 2 次元配列で必要なスレッド数を指定します。ユーザーが 5 つのスレッドを必要とする場合、各スレッドは 125 要素で計算を実行します。(簡単にするために、これらの条件の下でプログラムを動作させるために、これらの番号をハードコーディングしました)。

コードは 1 つのスレッドに対して機能し、for ループでシミュレートすると、すべてが正しく機能します。コンウェイズゲームオブライフプログラムです。1 つのスレッドまたは forloop で gen 関数を 5 回呼び出すと、プログラムは正常に動作します。グリッドを適切に印刷します。5 つのスレッドを使用すると、1 回印刷するだけでプログラムが終了します。

printf はスレッドでは機能しないため、スレッド内でテストすることはできません。私はこれに何時間も費やしましたが、理解できません。

int N; 
int **gridA;// odd generations
int **gridB;//even
int T = 5;//number of threads

int main ( int argc, char *argv[] ){
  int i,j;
  const int STACK_SIZE = 65536;
  char *stack;
  char *stackTop[t];
  pid_t cret[t], wret;
  N = 25;//array size [25][25];
  //initialize stack
   stack = malloc(STACK_SIZE);
  for(i = 0; i < T; i++){
    stackTop[i] = stack + STACK_SIZE;
  }

//initilize arrays and load gridA with input

    while(1){}
      for(i=0; i < T; i++) cret[i]=clone(generateNext, stackTop[i], CLONE_VM|SIGCHLD, (void*)i);//thread code
      for(i=0; i < T; i++) waitpid(cret[i],&status,0);//wait for threads to finish       

   //for(i=0; i < T; i++){generateNext((void*)i);} Simulate threads, works like this
    if(toggle){//grids used interchangeably. 
  print_array(gridA);
        toggle = 0;
    } else {
        print_array(gridB);
        toggle = 1;
    }
  }
}

//figures out the next generation
void generateNext(void *p){
//finds out the two points each thread will calculate for by using p
//eg first thread: gridA[0][24] to [4][24] 2nd thread: [5][25] to 9[25]
//then finds neighbours and changes state of each element accordingly

}
4

1 に答える 1

0

while(1){}悪い考えです。実際に問題を引き起こすコードを提供してください。

つまり、実際にはマルチスレッド用clone()waitpid()はなく、マルチプロセッシング用です。プロセスには個別のメモリ空間があるため、これは機能しません。マルチスレッドを始めるには、pthread のチュートリアルを確認してください。

于 2015-02-20T22:47:11.513 に答える