好像pthread_create似乎无法得到正确的参数

时间:2016-10-18 18:27:29

标签: c multithreading

当我运行以下代码时,打印输出似乎不正确。

void thread_Calc(int *pos) {
  printf("recieved %d\n", *pos);
  sig = -1;

  mandel_Calc(&slices[*pos],maxIterations,&res[(*pos)*slices[*pos].imSteps*slices[*pos].reSteps]);

  counter++;
  array[counter] = *pos;
  sig = *pos;
}


int main(int argc, char *argv[]) {

  while (WinH % nofslices != 0) { nofslices++;}

  slice_height = WinH/nofslices;

  level = 1;

  while (1) {

    for (i=0; i<nofslices; i++){
      array[i] = -1;
    }

    y=0;
    sig = -1;
    counter = -1;
    for(i=0; i<nofslices; i++){ 
      printf("Passing %d\n", i);

      check=pthread_create(&worker[i], NULL, (void*)thread_Calc, (void*)(int *)&i);
      if (check!=0) {
        printf("Error in pthread_create\n");
        return 0;
      }

      while (sig==-1||array[counter]==-1){

      }
    }
  } 
}    

(这只是我代码的一部分,所以假设每个变量都是正确的并且有一个值)。

我得到的结果是:

Passing 1
Passing 2
recieved 2
recieved 2
Passing 3
Passing 4
recieved 4
recieved 4
Passing 5
Passing 6
Passing 7
Passing 8
Passing 9

似乎我不能总是在pthread_create中传递正确的参数。

2 个答案:

答案 0 :(得分:1)

@Andrew是对的。传递指针而不是值,因此只要在主线程中更改“i”,就会在创建的线程接收的参数中更改值。您需要创建一个副本并将其传递给线程。

请参阅pthread_create : passing an integer as the last argument

答案 1 :(得分:0)

在此代码中:

   for(i=0; i<nofslices; i++){ 
      printf("Passing %d\n", i);

      check=pthread_create(&worker[i], NULL, (void*)thread_Calc, (void*)(int *)&i);

每个线程启动后,i的值会继续变化。

您传递i地址,因此当它在子线程中被取消引用时,它会保存您的main线程放入其中的任何值 at那个时间