Ошибка в функции для моего pthread

#c #pthreads

#c #pthreads

Вопрос:

У меня есть программа, которая принимает, как предполагается, число от пользователя = (n) и создает поток для вычисления суммы от 1 до n. Я знаю, что ((n 1)*n)/2 это даст мне тот же результат. Когда я запускаю программу, создается поток, но когда я запрашиваю значение 'TotalSum' , вместо вычисления на основе пользовательского ввода задается 0, почему?

 # include <stdio.h>
# include <pthread.h>

void * thread_calc(void *);
int TotalSum=0;

int main()
{
    int iNumber,iCount;
    pthread_t tid, tid2;
    printf("Enter Number Up to Which You want to Sum :");
    scanf("%d",amp;iNumber);    
    pthread_create(amp;tid,NULL,thread_calc,(void *) iNumber);
    //pthread_create(amp;tid2,NULL,thread_calc,(void *)(iNumber );




    printf("Thread %d running, Final Sum is : %d n", tid,TotalSum);
    //printf("Thread %d running, Final Sum is : %d n", tid2,TotalSum);
    //    return 0;
}

void *thread_calc(void *num)
{
    int *iNumber;
    iNumber=(int*)num;

    TotalSum = ((*iNumber   1)* (*iNumber))/2;

    pthread_exit(NULL);    
}
 

Мой вывод: (Например, пользователь вводит 10)

 Enter Number Up to Which You want to Sum :10
Thread 536937120 running, Final Sum is : 0
 

Ответ №1:

Ваш основной поток не ожидает завершения потока, и вы не передаете правильный аргумент функции потока:

   pthread_create(amp;tid, NULL,thread_calc, amp;iNumber); //pass the address of iNumber
  pthread_join(tid, NULL); // main thread waits for the thread_calc to return
 

Когда основной поток завершает работу, весь процесс завершается. Итак, вам нужно дождаться возврата потока pthread_join() .
Вы передаете iNumber себя в качестве значения указателя функции потока. Но функция потока на самом деле ожидает, что ее аргументом будет
указатель (при разыменовании iNumber in thread_calc() ).