我正在尝试重新掌握我的C语言技能。我想在不同的线程中对一个序列求和,每个线程将返回部分序列的总和指针。然而,当我尝试将 void*
类型的值 local_sum
转换为 int
时,出现了问题。
我曾试图使用 sum += *(int*)local_sum;
进行转换,但是出现了段错误,程序退出时显示 Process finished with exit code 11
。
后来我发现,如果我使用 sum += (int)local_sum;
,那么就没有问题了。但我无法说服自己:难道 local_sum
不应该是一个 void *
吗?为什么可以使用 (int)local_sum
来将其转换为 int
?
非常感谢您能够解答这个问题。
对每个进程返回值进行求和的部分如下:
int sum = 0;
for (int i = 0; i < NUM_THREADS; i ++) {
void * local_sum;
pthread_join(count_threads[i], (&local_sum));
sum += (int)local_sum;
}
线程的作用在这里:
void * count_thr(void *arg) {
int terminal = ARRAY_SIZE / NUM_THREADS;
int sum = 0;
for (int i = 0; i < terminal; i ++) {
sum += *((int*)arg + i);
}
return (void*)sum;
}
int
传递给 pthreads 中的void*
,而不是指向它,一直以来都是一种肮脏的技巧。而且像所有肮脏的技巧一样,它们最终会失效。将整数转换为指针具有实现定义的行为(至少使用uintptr_t
)。解决方案不是使用肮脏的技巧,而是传递一个指向malloc
分配的数据的指针。动态分配的开销执行时间与创建和关闭线程的成本相比微不足道。 - Lundin