我给4个数字。我想对不同线程中的前两个和后两个求和。我创建了一个程序,该程序可以正确添加前两个数字,但不能正确添加下两个数字。我刚刚开始学习pthread的工作原理,因此将不胜感激。
2
答案 0 :(得分:2)
这里有两个问题。首先,数组global
只能容纳3个元素,但是您尝试设置4个元素。 3
是用于声明 size 的声明,而不是最大元素的索引。因此将大小设置为4:
int global[4];
第二,两个线程函数都添加了相同的元素。您需要让其中一个获取数组索引0和1,另一个获取数组索引2和3。
n3=args_array[2];
n4=args_array[3];
答案 1 :(得分:1)
更改此
n3=args_array[0];
n4=args_array[1];
到
n3=args_array[2];
n4=args_array[3];
答案 2 :(得分: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;
}
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个