【发布时间】:2019-04-19 19:25:22
【问题描述】:
我正在尝试再次选择我的 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;
}
【问题讨论】:
-
在pthreads的
void*中传递int,而不是指向一个,一直是一种肮脏的黑客行为。就像所有肮脏的黑客一样,它们最终会崩溃。整数到指针的转换具有实现定义的行为(至少使用 uintptr_t)。解决方案不是使用脏黑客,而是传递一个指向 malloc:ed 数据的指针。与创建和关闭线程的成本相比,动态分配的开销执行时间算不了什么。
标签: c pointers type-conversion pthreads