pthread_exit 中参数的目的是什么?
What is the Purpose of argument in pthread_exit?
基本上,我想了解 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
无论如何,传递(10) 到pthread_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
,必然是non-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
,因此测试失败。然后打印 "thread failed".
如果打印 status
指针的值:
printf("status = %p\n", status);
在 if()
之前,您将能够看到传递给 pthread_exit()
的值是如何返回的。
基本上,我想了解 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
无论如何,传递(10) 到pthread_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
,必然是non-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
,因此测试失败。然后打印 "thread failed".
如果打印 status
指针的值:
printf("status = %p\n", status);
在 if()
之前,您将能够看到传递给 pthread_exit()
的值是如何返回的。