pthread函数的返回值与函数内的计算值不同

Returned value from pthread function is different from the calculated value within function

本文关键字:函数 计算 返回值 pthread      更新时间:2023-10-16

现在我正在尝试使用pthread函数的返回值。在下面的代码中,我想要得到的输出是"3899"或"9938",但程序输出的是"9999"或"3838"。当我在pthread函数中放入"cout"时,输出是正确的,但当我在main函数中放入"cout"时,输出却是错误的。有人能帮我检查一下我哪里做错了吗?

using namespace std;
#define NTHREADS 2
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
struct args{
  int * numbers;
  float result;
};
void *add(void* a){
   struct args *number = (struct args *)a;
   pthread_mutex_lock( &mutex1 );
   int *n = (int*) number->numbers;
   float sum =0;
   for(int i = 0; i < 5; i++){
     sum = sum + n[i] +5;
   }
   float av = sum/5;
   number-> result  = av;
   //cout << number->result <<endl;
    pthread_mutex_unlock( &mutex1 );
   return number;  
   }
void *substract(void* a){
 struct args *number = (struct args *)a;
 pthread_mutex_lock( &mutex1 );
 int *n = (int*) number->numbers;
 float sum =0;
 for(int i = 0; i < 5; i++){
    sum = sum + n[i] *3;
 }
 float av = sum/5;
 number-> result  = av;
 //  cout << number->result <<endl;
 pthread_mutex_unlock( &mutex1 );
 return number;
}
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;
struct args a;
a.numbers = numbers;
pthread_create( &thread_id[0], NULL, add, (void*) &a);
pthread_create( &thread_id[1], NULL, substract, (void*) &a );
void *status1;
void * status2;
pthread_join( thread_id[0], &status1);
pthread_join( thread_id[1], &status2);
args status = *(args*) status1;
float ra = status.result;
cout << ra << endl;
args statuss = *(args*) status2;
float rb = statuss.result;
cout << rb << endl;
 exit(EXIT_SUCCESS);
}

您得到这个输出是因为两个线程都将结果写入同一个位置struct args a

您需要在主函数中分配两个struct args,并将其中一个的地址传递给第一个线程,另一个传递给第二个线程。