使用pthread

时间:2015-12-07 21:31:19

标签: c++ multithreading pthreads

我使用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,这是正确的,但有时候是一个非常奇怪的数字。

我做错了什么?谢谢 。

2 个答案:

答案 0 :(得分:1)

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

您当前的代码中根本不需要使用任何互斥锁。事实上,通过使用互斥锁,您可以使您的应用程序有效地实现单线程,从而降低所有多线程优势。您可能需要互斥锁的唯一位置是在cout调用之前和之后 - 以确保输出不会交织在一起。

答案 1 :(得分:0)

您需要在代码中修复各种内容,但最棘手的问题是导致问题的是使用未初始化的变量 - &gt; sum