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;

这是有效的,因为指针是按值传递的。您提供的任何值都是进入线程函数的值。以前它不起作用,因为您传递了一个指向可能在另一个线程中更改的值的指针。

PS:不要忘记free最后循环中每个线程的结果。目前你没有清理你分配的内存。

于 2012-10-25T01:05:15.257 回答