#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()
).