【发布时间】:2014-02-25 01:53:35
【问题描述】:
我正在尝试使用 pthread_create 将数组作为参数传递给新线程中的函数,这可能吗?我有一个整数数组和一个从创建线程方法调用的计算平均值方法,但我似乎无法正确地将我的数组传递给该方法。这是我的代码: 整数 [];
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);
}
【问题讨论】:
-
这还能编译吗?
numsinmain似乎没有正确声明。 -
您应该真正确定您是否遇到了编译时、链接时或运行时问题。显示的代码不应该在没有警告的情况下编译;如果是,您需要提高编译的警告级别。你应该修复警告;请记住,C 编译器可能比您更了解 C。
-
线程的函数应该有签名
void *thread_function(void *arg)——一个接受“通用指针”(指向void的指针)作为参数并返回指向void的指针的函数。您的calcAvg()函数与此不匹配,因此michaeltang 的解决方案解决了该问题。最后没有特别的理由使用pthread_exit(0);;如果它是我的代码,我会使用return 0;— 但最终结果是相同的,只是编译器不会抱怨没有从应该这样做的函数返回值。 -
在函数中,从
void *到int *的转换是合法的,因为输入最初是一个int数组,它首先被转换为一个int指针(指向数组的第一个元素),然后指向void指针以匹配函数原型。您使用int *nums[]的声明设法使用了两级指针,其中只需要一个;使用int *nums或int nums[]会做得更好——在函数声明或定义中使用时会有等价的(但仅在该上下文中——在其他地方,它们是相当不同的)。 -
剩下的问题是样式问题——和线程安全问题。您使用两个全局变量
size和average。鉴于您的主线程在唯一的子线程正在执行时进入睡眠状态,所以没有问题。如果您有两个或更多子线程,则需要担心使用变量是否安全。鉴于size在线程启动后就已修复(因此他们只会读取它),那么就可以了。但是,如果多个线程正在访问average,您确实需要一个互斥锁或类似的东西来保护它免受并发访问。
标签: c arrays multithreading