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() 的值是如何返回的。