0

以下は、ユーザーが指定した多数のスレッドを作成するコード ブロックです。次に、各スレッドが乱数を生成し、その平方根を計算します。スレッドが同じ ID を取得している理由がわかりません。スレッドが作成されている場所であるため、64 行目が原因です。ループ内で、すべてのスレッドが同時に生成される原因となっている何かが発生していると思われます。

////////////////////////////////////////////////
//
//
// Zach
//
// 
//
//
////////////////////////////////////////////////



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <math.h>





void *squareroot(void *num1)
{
  int *id = (int *)num1;
  int incoming = rand()/100;
  float *outgoing = (float *)malloc(sizeof(float));
  printf("%d \n", *id);
  printf("%d\n", incoming);
  *outgoing = 5.000;
  //Calculate the square root of the number passed to the function
  *outgoing = sqrt(incoming);
  return outgoing;

}


int main(int argc, char* argv[])//testing funcion
{
  srand(time(NULL));
  int i, j;
  int *temp = (int *)malloc(sizeof(int));
  if (argc != 2) 
  {

    printf ("ERROR: Enter a number\n");
    return 1;

  }

  int loop = atoi(argv[1]); //grabbing the integer supplied by user
  pthread_t thread_id[loop];
  void *exit_status;
  float *thread_result;

  for(i = 0; i < loop; i++)
  {

    pthread_create(&thread_id[i], NULL, squareroot, &i);
  }


  for(j = 0; j < loop; j++)
  {
    pthread_join(thread_id[j], &exit_status);
    thread_result = (float *)exit_status;
    printf("%f\n", *thread_result);

  }


}
4

1 に答える 1

2

何が起こっているのかというと、スレッドのいずれかが実際に実行されて一意のIDが抽出される前に、ループがすべてのスレッド(または少なくとも一部のスレッド)の作成を終了することだと思います。

にポインタを渡しているのでi、各スレッドが最終的にそのパラメータのチェックに取り掛かったとき、iすでに終了しています...または少なくとも途中で。危険なのは、複数のスレッドがの同じ値を参照する可能性があることですi。そのポインタから値をコピーしないことはさらに悪いことです-常にそれを逆参照します。つまり、スレッドの実行中に変更される可能性があります。

代わりにすべきことは、それがポインタであるふりをすることです。

pthread_create(&thread_id[i], NULL, squareroot, (void*)i);

そしてあなたのスレッド関数で:

int id = (int)num1;

これは、ポインタが値によって渡されるために機能します。提供する値は、スレッド関数に入る値です。以前は、別のスレッドで変更される可能性のある値へのポインターを渡したため、機能しませんでした。

freePS:最後にループ内の各スレッドからの結果を忘れないでください。現時点では、割り当てたメモリをクリーンアップしていません。

于 2012-10-25T01:05:15.257 に答える