Насколько я понимаю, pthread_exit() точно соответствует возврату, когда вам нужно завершить поток с возвращаемым значением. Когда люди могут использовать согласованный способ, т.е. Возвращать, выполнять работу, почему Pthread определяет такой дублированный интерфейс?
Pthread: Почему люди пытаются использовать pthread_exit?
Ответ 1
Две причины, которые мне приходят в голову: pthread_exit
-
Позволяет выйти из потока с любой глубины в стеке вызовов.
-
Должен быть вызван в основной поток, если для ключей TLS для основного потока будут созданы свои бесплатные функции. И здесь а также: "Любые обработчики очистки отмены, которые были вытолкнуты и еще не вытолкнуты, вытолкнуты в обратном порядке, чтобы они были нажаты и затем выполнены. После того, как все обработчики очистки отмены были выполнены, если поток имеет какие-либо данные, зависящие от потока, функции деструктора будут вызваны в неуказанном порядке... Неявный вызов pthread_exit() выполняется, когда поток, отличный от потока в который был вызван первым(), возвращается из начальной процедуры, которая была использована для ее создания. Значение возвращаемой функции служит как статус выхода потока.
Ответ 2
Если вы собираетесь называть pthread_exit дублированным интерфейсом, вы также должны вызвать exit()
дублированный интерфейс, так как вы можете выйти из программы в произвольной точке. Вероятно, вы хотите вызвать pthread_exit()
, когда у вас есть какое-то условие ошибки, когда вы просто не можете продолжить. Или, альтернативно, вы нашли любое значение, которое вы ищете внутри потока.
Что касается его реального существования, согласно документации:
Неявный вызов pthread_exit() выполняется, когда поток, отличный от потока, в котором был вызван main(), возвращается из начальной процедуры, которая была использована для ее создания. Возвращаемое значение функции служит как статус выхода потока.
Итак, если вы сделали return <some pointer>
из потока или просто достигли конца, pthread_exit()
будет вызываться в любом случае. То же самое с выходом из main()
, если вы return 0
вы на самом деле вызываете exit(0)
. Функция должна существовать, иначе у ядра не было бы способа определить, вышел ли поток.