我正在学习使用pthread编程加法器程序,在引用几个代码后仍然没有得到如何使用结构将多个参数传递到线程中,这是我的错误程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
typedef struct s_addition {
int num1;
int num2;
int sum;
} addition;
void *thread_add_function (void *ad)
{
printf ("ad.num1:%d, ad.num2:%d\n",ad.num1, ad.num2);
ad.sum = ad.num1 + ad.num2;
pthread_exit(0);
}
int main()
{
int N = 5;
int a[N], b[N], c[N];
srand (time(NULL));
// fill them with random numbers
for ( int j = 0; j < N; j++ ) {
a[j] = rand() % 392;
b[j] = rand() % 321;
}
addition ad1;
pthread_t thread[N];
for (int i = 0; i < N; i++) {
ad1.num1 = a[i];
ad1.num2 = b[i];
printf ("ad1.num1:%d, ad1.num2:%d\n",ad1.num1, ad1.num2);
pthread_create (&thread[i], NULL, thread_add_function, &ad1);
pthread_join(thread[i], NULL);
c[i] = ad.sum;
}
printf( "This is the result of using pthread.\n");
for ( int i = 0; i < N; i++) {
printf( "%d + %d = %d\n", a[i], b[i], c[i]);
}
}
但是在编译时我收到了以下错误:
vecadd_parallel.c:15:39:错误:成员引用基类型'void *'不是 结构或联合 printf(“ad.num1:%d,ad.num2:%d \ n”,ad.num1,ad.num2);
我试过但仍然无法得到线索,我做错了什么?
答案 0 :(得分:2)
似乎您在尝试访问void数据类型的成员时遇到问题。
您需要添加一行来将参数转换为thread_add_function
到与addition* add = (addition*)ad;
类似的正确数据类型,然后在函数中使用此变量(请注意,您还必须更改r .
->
malloc()
,因为它是指针
您还应该只将数据传递给{{1}}&#d; dd的线程,因为堆栈分配的数据可能不是永久性的。对于当前的实现应该没问题,但是稍后的更改很容易产生奇怪的,不可预测的行为。