关于pthread_create()和pthread_join()

时间:2015-10-16 18:51:00

标签: c linux multithreading pointers pthreads

我刚刚开始研究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设置为指针类型?

对于第二个,为什么我只需要一个局部变量地址的双指针转换?

1 个答案:

答案 0 :(得分:1)

您的函数myThreadFunc将指向内存中任何位置的指针作为其参数。我们不知道该位置的类型,因此它是void *并且您将其转换为您想要的任何类型。您将其转换为指向整数argForThread的指针,该指针将为&argForThread,然后您将其降级,产生值10。

您的退货声明不正确。您正在返回&result,但变量位于堆栈中。函数返回后,变量不再存在。如果要将计算值返回给调用者,则需要为其分配内存,然后返回已分配内存的地址。然后调用者将对其接收的地址进行derefrence,获取值,最后释放内存。 (新手程序员可能会返回静态值的地址或堆栈中的某些内容,但这不是线程安全的。)

当您返回(void *)result时,您将返回值result,就像它是指向内存中某处的指针一样。该内存位置几乎肯定无效。但是,这并不重要,因为您不会取消引用返回的位置。 (我应该注意,在具有32位整数和64位指针的系统上,您将获得不可预测的行为。)

线程结果是void **,因为您传入的指针将被突变以指向myThreadFunc返回的位置。因此,在您的示例中,threadResult将以值result * result结束,因此它将指向无效的内存位置。在你的例子中没问题,因为threadResult是整数,而不是指针。