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

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

现在我正在尝试使用 pthread 函数 return 值。在下面的代码中,我想得到的输出是“38 99”或“99 38”,但程序输出“99 99”或“38 38”。 当我把 "cout" 放在 pthread 函数中时,输出是正确的,但是当我把 "cout" 放在 main 函数中时,输出是错误的。谁能帮我看看哪里做错了?

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.

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