我刚刚开始研究pthread
跨平台。但我对用于pthread_create()
和pthread_join()
的变量类型感到困惑。请查看以下代码。
// This is just simple code for test, so don't take this variable seriously!
int result;
void* myThreadFunc(void* arg) {
result = *(int*)arg;
// Why not &result, but result???
return (void*)result;
}
int main() {
pthread_t myThread;
int argForThread = 10;
int threadResult = 0;
pthread_create(&myThread, NULL, myThreadFunc, (void*)&argForThread);
// Why (void**), but not (void*)?
pthread_join(myThread, (void**)&threadResult);
return 0;
}
正如我在评论中所写,我不明白这些指针,对我来说没有意义。
对于第一个,为什么我必须将值类型1设置为指针类型?
对于第二个,为什么我只需要一个局部变量地址的双指针转换?
答案 0 :(得分:1)
您的函数myThreadFunc
将指向内存中任何位置的指针作为其参数。我们不知道该位置的类型,因此它是void *
并且您将其转换为您想要的任何类型。您将其转换为指向整数argForThread
的指针,该指针将为&argForThread
,然后您将其降级,产生值10。
您的退货声明不正确。您正在返回&result
,但变量位于堆栈中。函数返回后,变量不再存在。如果要将计算值返回给调用者,则需要为其分配内存,然后返回已分配内存的地址。然后调用者将对其接收的地址进行derefrence,获取值,最后释放内存。 (新手程序员可能会返回静态值的地址或堆栈中的某些内容,但这不是线程安全的。)
当您返回(void *)result
时,您将返回值result
,就像它是指向内存中某处的指针一样。该内存位置几乎肯定无效。但是,这并不重要,因为您不会取消引用返回的位置。 (我应该注意,在具有32位整数和64位指针的系统上,您将获得不可预测的行为。)
线程结果是void **
,因为您传入的指针将被突变以指向myThreadFunc
返回的位置。因此,在您的示例中,threadResult
将以值result * result
结束,因此它将指向无效的内存位置。在你的例子中没问题,因为threadResult
是整数,而不是指针。