Multithreading 将返回值从一个线程传递到另一个线程

Multithreading 将返回值从一个线程传递到另一个线程,multithreading,pointers,Multithreading,Pointers,我正在学习posix线程编程,并在以下程序中苦苦挣扎。所以我有两个ID为:tid1和tid2的线程。我使用带有tid1的线程将我希望彼此求和的值输入带有tid2的第二个线程,但求和的结果不正确。因此,我尝试在tid2中显示我在tid1中输入的值,但我意识到这些值也不正确(与输入的值不对应)。你能告诉我我在哪里出错吗?我将从tid1线程返回的指针传递到tid2线程的方式,对吗 注意:从tid1返回的值已经正确,因为我检查了它,您也可以在main(第56行)中看到 #包括 #包括 #包括 #包括 v

我正在学习posix线程编程,并在以下程序中苦苦挣扎。所以我有两个ID为:tid1和tid2的线程。我使用带有tid1的线程将我希望彼此求和的值输入带有tid2的第二个线程,但求和的结果不正确。因此,我尝试在tid2中显示我在tid1中输入的值,但我意识到这些值也不正确(与输入的值不对应)。你能告诉我我在哪里出错吗?我将从tid1线程返回的指针传递到tid2线程的方式,对吗

注意:从tid1返回的值已经正确,因为我检查了它,您也可以在main(第56行)中看到

#包括
#包括
#包括
#包括
void*entryValues(void*p)
{
int nbVal=*(int*)p;
int i=0;
int-val=0;
int*选项卡;
而(i
有人能帮帮我吗?有人能帮帮我吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

void *entryValues(void *p)
{
   int nbVal = *(int*)p;
   int i = 0;
   int val = 0;
   int *tab;

   while(i < nbVal){
      printf("value %d: ", i);
      scanf("%d", &val);
      tab[i] = val;
      i++;
   }

   pthread_exit(tab);

}

void *sumValues(void *p)
{
    int *values;
    int sum = 0, i = 0;
    memcpy(values, (int*)p, sizeof((int*)p));
    printf("%d\n", values[0]);
    for (i = 0; i < sizeof(values); i++)
    {
    //printf("value %d: %d\n", i, values[i]);
    sum += values[i];
    }
    printf("The sum of the entered values is: %d\n", sum);
    return NULL;

}

int main(int argc, char **argv)
{
   pthread_t tid1;
   pthread_t tid2;
   int nbValues = 0;
   int *arr;

   printf("Please enter the number of values you want to sum each other: ");
   scanf("%d", &nbValues);
   if(pthread_create(&tid1, NULL, entryValues, &nbValues)!= 0)
   {
    fprintf(stderr, "creation of thread failed\n");
    return -1;
   }

   pthread_join(tid1, (void**)&arr);
   //printf("array: %d\n", arr[0]);

   if(pthread_create(&tid2, NULL, sumValues, arr) != 0)
   {
    fprintf(stderr, "creation of thread failed\n");
    return -1;
   }
   pthread_join(tid2, NULL);
   /* Waiting for the termination of tid */
   printf("End of main thread\n");
   return EXIT_SUCCESS;

}