в основном, я пытаюсь понять настоящую цель 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(), попадет в переменную status в main(). Вы никогда не печатаете содержимое status — все, что вам нужно сделать, это сравнить его с NULL в условии if (). Выводимое значение — это значение, хранящееся в result, которое не изменяется с помощью pthread_exit() или pthread_join(), поэтому, конечно, оно всегда будет одним и тем же.
В вашей функции my_thread() указатель result всегда будет адресом переменной result в main(), поэтому вы увидите следующие случаи:
pthread_exit(result); // Exit 1
В main()status в конечном итоге будет равно (void *)&result, что обязательно не равно NULL, поэтому тест проходит успешно. Затем он печатает значение result, которое было установлено в 42 первой строкой my_thread().
pthread_exit((void *)10); // Exit 2
В main()status окажется равным (void *)10. В любой распространенной реализации C это значение будет не равно NULL, поэтому тест пройдет успешно. Затем он печатает значение result, которое было установлено в 42 первой строкой my_thread().
pthread_exit(0); // Exit 3
В main()status окажется равным (void *)0. Это обязательно сравнивается с равным NULL, поэтому тест не пройден. Затем он печатает «сбой потока».
Если вы напечатаете значение указателя status с помощью:
printf("status = %p\n", status);
перед if () вы сможете увидеть, как возвращается значение, переданное pthread_exit().