Вы только что написали неправильные индексы во втором потоке, это должно работать:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[4];
void *sum_thread(void *arg)
{
int *args_array;
args_array = arg;
int n1,n2,sum;
n1=args_array[0];
n2=args_array[1];
sum = n1+n2;
printf("N1 + N2 = %d\n",sum);
return sum;
}
void *sum_thread1(void *arg)
{
int *args_array;
args_array = arg;
int n3,n4,sum2;
//this is args_array[2] and not args_array[0]
n3=args_array[2];
//this is args_array[3] and not args_array[1]
n4=args_array[3];
sum2=n3+n4;
printf("N3 + N4 = %d\n",sum2);
return sum2;
}
int main()
{
printf("First number: ");
scanf("%d",&global[0]);
printf("Second number: ");
scanf("%d",&global[1]);
printf("Third number: ");
scanf("%d",&global[2]);
printf("Fourth number: ");
scanf("%d",&global[3]);
pthread_t tid_sum;
pthread_create(&tid_sum,NULL,sum_thread,global);
pthread_join(tid_sum,NULL);
pthread_t tid_sum1;
pthread_create(&tid_sum1,NULL,sum_thread1,global);
pthread_join(tid_sum1,NULL);
return 0;
}
Поскольку два потока практически выполняют одни и те же операции, вы можете просто объявить одну подпрограмму потока и передать правильные указатели:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[4];
void *sum_thread(void *arg)
{
int *args_array;
args_array = arg;
int n1,n2,sum;
n1=args_array[0];
n2=args_array[1];
sum = n1+n2;
printf("N1 + N2 = %d\n",sum);
return sum;
}
int main()
{
printf("First number: ");
scanf("%d",&global[0]);
printf("Second number: ");
scanf("%d",&global[1]);
printf("Third number: ");
scanf("%d",&global[2]);
printf("Fourth number: ");
scanf("%d",&global[3]);
pthread_t tid_sum, tid_sum1;
pthread_create(&tid_sum,NULL,sum_thread,global);
pthread_create(&tid_sum1,NULL,sum_thread,global + 2);
pthread_join(tid_sum,NULL);
pthread_join(tid_sum1,NULL);
return 0;
}
также глобальная переменная должна содержать 4 элемента, а не 3