使用线程计算两个数字的总和
Calculate the sum of two numbers using thread
我编写了这个小程序,用于从用户那里读取两个数字并使用线程函数计算它们的和,该线程函数还负责在屏幕上显示结果。
int global[2];
void *sum_thread(void *arg)
{
int *args_array;
args_array = *(int**)arg;
int n1,n2,sum;
n1=args_array[0];
n2=args_array[1];
sum = n1+n2;
printf("N1 + N2 = %d\n",sum);
return NULL;
}
int main()
{
printf("First number: ");
scanf("%d",&global[0]);
printf("Second number: ");
scanf("%d",&global[1]);
pthread_t tid_sum;
pthread_create(&tid_sum,NULL,sum_thread,(void*)&global);
pthread_join(tid_sum,NULL);
return 0;
}
但是,当我 运行 代码时,由于分段错误,它无法正常工作。我想我正在尝试 access/use 未分配的内存。我应该用 malloc 分配它还是我做错了其他事情?
数组名,global
指向数组基地址。您可以简单地传递它并在您的线程函数中使用它。
然而,只是提一个逻辑点,如果你将 global
作为参数传递给 sum_thread()
函数,它不需要是 global.
在您的代码中,更改
pthread_create(&tid_sum,NULL,sum_thread,(void*)&global);
到
pthread_create(&tid_sum,NULL,sum_thread,global);
然后,在sum_thread()
函数中
args_array = *(int**)arg;
到
args_array = arg;
您将 (void*)&global
作为线程启动函数的参数传递。 &global
的类型是 (*)int[2] -- 指向两个 int
的数组的指针。这与 int **
不同且不兼容,int **
是指向 int
的指针。数组不是指针。
@SouravGhosh 已经提供了一个可以正确输入的解决方案,应该可以正常工作。然而,我观察到,在这种特殊情况下,将指针传递给全局数组有点愚蠢,因为线程可以直接读取数组:
void *sum_thread(void *arg)
{
int n1,n2,sum;
n1=global[0];
n2=global[1];
sum = n1+n2;
printf("N1 + N2 = %d\n",sum);
return NULL;
}
我编写了这个小程序,用于从用户那里读取两个数字并使用线程函数计算它们的和,该线程函数还负责在屏幕上显示结果。
int global[2];
void *sum_thread(void *arg)
{
int *args_array;
args_array = *(int**)arg;
int n1,n2,sum;
n1=args_array[0];
n2=args_array[1];
sum = n1+n2;
printf("N1 + N2 = %d\n",sum);
return NULL;
}
int main()
{
printf("First number: ");
scanf("%d",&global[0]);
printf("Second number: ");
scanf("%d",&global[1]);
pthread_t tid_sum;
pthread_create(&tid_sum,NULL,sum_thread,(void*)&global);
pthread_join(tid_sum,NULL);
return 0;
}
但是,当我 运行 代码时,由于分段错误,它无法正常工作。我想我正在尝试 access/use 未分配的内存。我应该用 malloc 分配它还是我做错了其他事情?
数组名,global
指向数组基地址。您可以简单地传递它并在您的线程函数中使用它。
然而,只是提一个逻辑点,如果你将 global
作为参数传递给 sum_thread()
函数,它不需要是 global.
在您的代码中,更改
pthread_create(&tid_sum,NULL,sum_thread,(void*)&global);
到
pthread_create(&tid_sum,NULL,sum_thread,global);
然后,在sum_thread()
函数中
args_array = *(int**)arg;
到
args_array = arg;
您将 (void*)&global
作为线程启动函数的参数传递。 &global
的类型是 (*)int[2] -- 指向两个 int
的数组的指针。这与 int **
不同且不兼容,int **
是指向 int
的指针。数组不是指针。
@SouravGhosh 已经提供了一个可以正确输入的解决方案,应该可以正常工作。然而,我观察到,在这种特殊情况下,将指针传递给全局数组有点愚蠢,因为线程可以直接读取数组:
void *sum_thread(void *arg)
{
int n1,n2,sum;
n1=global[0];
n2=global[1];
sum = n1+n2;
printf("N1 + N2 = %d\n",sum);
return NULL;
}