我刚开始为跨平台学习。但我对pthreadpthread_create()使用的变量类型感到困惑。请看下面的代码。

// 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作为指针类型?
对于第二个变量,为什么只需要对局部变量的地址进行双指针转换?

最佳答案

函数的参数是指向内存中任何位置的指针。我们不知道那个位置的类型,所以它是一个myThreadFunc,你可以把它转换成你想要的任何类型。您将它投射到一个指向整数void *的指针上,这个整数应该是argForThread,然后对它进行反频,产生10的值。
你的报税表不正确。您返回的是&argForThread,但变量在堆栈上。函数返回后,变量不再存在。如果要将计算值返回给调用方,则需要为此分配内存,然后返回已分配内存的地址。然后,调用者将对接收到的地址进行反加密,获取值,最后释放内存。(新手程序员可能会返回静态值的地址或堆栈上的某些内容,但这不是线程安全的。)
当您返回&result时,您返回的值就好像它是指向内存中某个地方的指针一样。那个内存位置几乎肯定是无效的。不过,这并不重要,因为您不会取消引用返回的位置。(我应该注意,在一个有32位整数和64位指针的系统上,您将得到不可预测的行为。)
线程结果是一个(void *)result,因为您传入的指针将被修改为指向result返回的位置。因此在您的示例中,void **将以值myThreadFunc结束,因此它将指向无效的内存位置。在您的示例中,这是可以的,因为threadResult是一个整数,而不是指针。

09-10 07:51
查看更多