我试图使用pthread_create将数组作为参数传递给新线程中的函数,这可能吗?我有一个整数数组和一个从创建线程方法调用的计算平均方法,但我似乎无法正确地将我的数组传递给方法。这是我的代码: int nums [];
int average;
int size = 0;
void *calcAvg(int *nums[]);
int main(int argc, char *argv[]){
/* initialize an array of the integers to be passed */
nums[argc - 1];
for(int i = 0; i < argc - 1; i++){
nums[i] = atoi(argv[i + 1]);
size++;
}
/* Thread Identifier */
pthread_t avgThread;
pthread_create(&avgThread, NULL, calcAvg, nums);
pthread_join(avgThread, NULL);
printf("average= %d", average);
}
void *calcAvg(int *nums[]){
int sum;
for(int i = 0; i < size; i++){
sum += nums[i];
}
average = sum / (size);
pthread_exit(0);
}
答案 0 :(得分:5)
你的代码中存在很多问题,我修复了一些进行编译 希望它会有所帮助
编译:gcc -o main main.c -lpthread
执行:./ main 2 5
输出:3
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int average;
int size = 0;
void *calcAvg(void *arg);
int main(int argc, char *argv[]){
/* initialize an array of the integers to be passed */
int *nums = (int*)malloc((argc - 1)*sizeof(int));
int i = 1;
for(i = 1; i < argc ; i++){
nums[i-1] = atoi(argv[i]);
size++;
}
/* Thread Identifier */
pthread_t avgThread;
pthread_create(&avgThread, NULL, calcAvg, (void*)nums);
pthread_join(avgThread, NULL);
printf("average = %d \n",average);
free(nums);
}
void *calcAvg(void *arg){
int *val_p = (int *) arg;
int sum = 0;
int i = 0;
for( i = 0; i < size; i++){
sum += val_p[i];
}
average = sum / (size);
pthread_exit(0);
}
答案 1 :(得分:1)
更改以下内容
void *calcAvg(int *nums[]){
int sum;
for(int i = 0; i < size; i++){
sum += nums[i];
}
average = sum / (size);
pthread_exit(0);
}
到
void *calcAvg(void *arg){
int *val_p = (int *) arg;
int sum;
for(int i = 0; i < size; i++){
sum += val_p[i];
}
average = sum / (size);
pthread_exit(0);
}
答案 2 :(得分:0)
&#39; pthread_create()&#39;的主要问题将void指针作为其最后一个参数。您正试图向它传递一个指向整数的指针数组。问题&#34; man pthread_create&#34;在终端上查看你应该传递的参数类型。
你真正想做的只是将数组整数传递给线程。在C中,数组索引只是指针算法的表示法。写nums[i]
与&nums[0] + i
或nums+i
等同。最后一种情况是有效的,因为C中数组的名称可以用作指向数组第一个元素的指针。
将void *calcAvg(int *nums[])
更改为void *calcAvg(void* thread_args)
。然后在&#39; calcAvg&#39;写int *nums = (int*)thread_args
。现在,您可以在该函数中使用nums
,就像调用calcAvg(nums)
一样,实际上您已经完成了。{/ p>
答案 3 :(得分:0)
pthread_create()
的最后一个参数必须是(void *)
类型。
使用线程查看此程序以打印随机元素的二维数组:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include<pthread.h>
void *print(A[][10]);
int main(){
int n=3,i,j;
pthread_t p1;
srand(time(NULL));
int A[10][10],B[10][10];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A[i][j]=(rand() % 100) + 1;
pthread_create(&p1,NULL,print,(void*)A);
pthread_join(p1,NULL);
return 0;
}
void *print(A[][10]){
int i,j,n;
n=3;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d ",A[i][j]);
printf("\n");
}
}