gpt4 book ai didi

c - pthread_exit 中参数的目的是什么?

转载 作者:行者123 更新时间:2023-11-30 19:01:49 26 4
gpt4 key购买 nike

基本上,我试图理解 pthread_exit 的真正目的。 如您所见,我尝试过多个 pthread_exit 代码。 以下是我观察到的结果:

- Exit 1: 42
- Exit 2: 42
- Exit 3: thread failed
- Exit 4: error
- Exit 5: 42
- Without a pthread_exit statement: 42

无论如何,传递给 pthread_exit 的值(10)将被忽略(Exit 2)并打印我们通过指针修改的值(42)。那么这里 pthread_exit 参数的真正目的是什么?令人困惑。

int a;
void *myThread(void *result)
{
int a = 5;
*((int*)result) = 42;
pthread_exit(result); // Exit 1
//pthread_exit((void *)10); // Exit 2
//pthread_exit(0); // Exit 3
//pthread_exit(); // Exit 4
//pthread_exit((void *)&a); // Exit 5
}
int main()
{
pthread_t tid;
void *status = 0;
int result;

pthread_create(&tid, NULL, myThread, &result);
pthread_join(tid, &status);

if (status != 0 ) {
printf("%d\n",result);
} else {
printf("thread failed\n");
}
return 0;
}

最佳答案

pthread_exit() 获取您传递给它的指针值,并安排将指针值返回到 void * 变量中,该变量的地址将传递给 pthread_join ().

就您而言,这意味着传递给 pthread_exit() 的值最终将出现在 main() 中的 status 变量中。您永远不会打印 status 的内容 - 您所做的只是在 if () 条件中针对 NULL 进行测试。您要打印的值是存储在 result 中的值,该值不会被 pthread_exit()pthread_join() 修改,所以当然它永远都是一样的。

my_thread() 函数中,指针 result 始终是 main 中 result 变量的地址(),因此您将看到以下情况:

pthread_exit(result);      // Exit 1

main() 中,status 最终将等于 (void *)&result,它必然是非 NULL,因此测试成功。然后,它打印 result 的值,该值由 my_thread() 第一行设置为 42

pthread_exit((void *)10);  // Exit 2

main()中,status最终将等于(void *)10。在任何常见的 C 实现上,该值将不等于 NULL,因此测试成功。然后,它打印 result 的值,该值由 my_thread() 第一行设置为 42

pthread_exit(0);           // Exit 3

main()中,status最终将等于(void *)0。这必然等于 NULL,因此测试失败。然后它打印“线程失败”。

如果使用以下方式打印 status 指针的值:

printf("status = %p\n", status);

if()之前,您将能够看到传递给pthread_exit()的值是如何返回的。

关于c - pthread_exit 中参数的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57175365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com