将结构传递给 pthread_create 的启动例程
Pass a struct to pthread_create's startup routine
所以我有一个作业遇到了麻烦。我正在尝试使用 pthreads 将矩阵的元素与 3 个不同的处理器相加。我有一个结构
typedef struct{
int rows;
int cols;
pid;
int localsum;
}ThreadData;
一些全局变量
int processors=3;
int rows=4;
int cols=4;
int matrix[10][10];
和求和函数
void *matrixSum(void *p){
//cast *a to struct ThreadData?
int sum=0;
int i=p->pid;
int size=p->rows*p->cols;
//to sequentially add a processor's 'owned' cells
int row=p-pid/p-cols;
int col=p-pid%p->cols;
int max_partition_size = ((size/processors)+1);
for(i;i<max_partition_size*processors;i+=processors){
col=i%p->cols;
row=i/p->cols;
if(i<=size-1){
sum+=matrix[row][col]+1;
}
}
p->localsum=sum;
}
所以我的主要方法是这样的:
int main(){
int totalsum=0;
ThreadData *a;
a=malloc(processors*(sizeof(ThreadData));
int i;
for(i=0;i<processors;i++){
a[i].rows=rows;
a[i].cols=cols;
a[i].pid=i;
a[i].localsum=0;
}
//just a function that iterates over the matrix to assign it some contents
fillmatrix(rows, cols);
pthread_t tid[processors];
for(i=0;i<processors;i++){
pthread_create(tid,NULL,matrixSum,(void *)&a);
totalsum+=a[i].localsum;
}
pthread_join();
}
我的最终目标是将 matrixSum()
与 ThreadData
结构作为参数传递。
所以我认为我必须将 matrixSum()
中给出的 void 指针转换为一个结构,但我在这样做时遇到了麻烦。
我试过这样做
ThreadData *a=malloc(sizeof(ThreadData));
a=(struct ThreadData*)p;
但是我收到 warning: assignment from incompatible pointer type
错误。
那么执行此操作的正确方法是什么 - 即转换从参数中获取的 void 指针,并像它应该成为的结构一样对其进行操作?
尝试使用 a=(ThreadData*)p;
。
在C语言中,struct ThreadData
与ThreadData
不同。
在这种情况下,您使用了 typedef
并且没有为结构定义标签,因此您不能使用 struct
来使用结构。
所以我有一个作业遇到了麻烦。我正在尝试使用 pthreads 将矩阵的元素与 3 个不同的处理器相加。我有一个结构
typedef struct{
int rows;
int cols;
pid;
int localsum;
}ThreadData;
一些全局变量
int processors=3;
int rows=4;
int cols=4;
int matrix[10][10];
和求和函数
void *matrixSum(void *p){
//cast *a to struct ThreadData?
int sum=0;
int i=p->pid;
int size=p->rows*p->cols;
//to sequentially add a processor's 'owned' cells
int row=p-pid/p-cols;
int col=p-pid%p->cols;
int max_partition_size = ((size/processors)+1);
for(i;i<max_partition_size*processors;i+=processors){
col=i%p->cols;
row=i/p->cols;
if(i<=size-1){
sum+=matrix[row][col]+1;
}
}
p->localsum=sum;
}
所以我的主要方法是这样的:
int main(){
int totalsum=0;
ThreadData *a;
a=malloc(processors*(sizeof(ThreadData));
int i;
for(i=0;i<processors;i++){
a[i].rows=rows;
a[i].cols=cols;
a[i].pid=i;
a[i].localsum=0;
}
//just a function that iterates over the matrix to assign it some contents
fillmatrix(rows, cols);
pthread_t tid[processors];
for(i=0;i<processors;i++){
pthread_create(tid,NULL,matrixSum,(void *)&a);
totalsum+=a[i].localsum;
}
pthread_join();
}
我的最终目标是将 matrixSum()
与 ThreadData
结构作为参数传递。
所以我认为我必须将 matrixSum()
中给出的 void 指针转换为一个结构,但我在这样做时遇到了麻烦。
我试过这样做
ThreadData *a=malloc(sizeof(ThreadData));
a=(struct ThreadData*)p;
但是我收到 warning: assignment from incompatible pointer type
错误。
那么执行此操作的正确方法是什么 - 即转换从参数中获取的 void 指针,并像它应该成为的结构一样对其进行操作?
尝试使用 a=(ThreadData*)p;
。
在C语言中,struct ThreadData
与ThreadData
不同。
在这种情况下,您使用了 typedef
并且没有为结构定义标签,因此您不能使用 struct
来使用结构。