使用pthread时的随机结果

Random results when using pthread

本文关键字:随机 结果 pthread 使用      更新时间:2023-10-16

我用pthread写了一个简单的程序,但结果是随机的。。。。

#define NTHREADS 2
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

void *add(void* numbers){
  pthread_mutex_lock( &mutex1 );
  int *n = (int*) numbers;
  float sum;
  for(int i = 0; i < 5; i++){
     sum = sum + n[i] +5;
  }
  cout << sum/5<<endl;
  pthread_mutex_unlock( &mutex1 );
}

void *substract(void* numbers){
  pthread_mutex_lock( &mutex1 );
  int *n = (int*) numbers;
  float sum;
  for(int i = 0; i < 5; i++){
   sum = sum + n[i] -10;
  }
  cout << sum/5<<endl;
  pthread_mutex_unlock( &mutex1 );
}
main(){
  pthread_t thread_id[NTHREADS];
  int i, j;
  int *numbers = new int[5];
  numbers[0] = 34; numbers[1] = 2; numbers[2]= 77; numbers[3] = 40; numbers[4] = 12;
  pthread_create( &thread_id[0], NULL, add, (void*) numbers);
  pthread_create( &thread_id[1], NULL, substract, (void*) numbers );
  pthread_join( thread_id[0], NULL);
  pthread_join( thread_id[1], NULL);
  exit(EXIT_SUCCESS);
}

程序的输出是随机的。。。。有时会出现

 -2.42477e+26
  23

有时它只得到一个奇怪的数字,比如

 235.69118e+13
 (empty space)

我也尝试过只使用一个线程,但结果仍然是随机的。例如,我只使用线程来计算"加法",结果有时是38,这是正确的,但有时是一个非常奇怪的数字。

我哪里做错了?非常感谢。

正如我在上一个问题中告诉您的那样,使用随机数的原因是在使用之前没有初始化总和。您的代码也存在其他问题(请参阅注释),但它们不对随机结果直接负责。

您也不需要在当前代码中使用任何互斥对象。事实上,通过使用互斥,您使应用程序有效地实现了单线程,从而释放了所有多线程的好处。唯一可能需要互斥的地方是在cout调用前后,以确保输出不会交织在一起。

您的代码中有各种各样的问题需要修复,但最"棘手的问题"是使用未初始化的变量->sum