Pthread: Почему люди пытаются использовать pthread_exit?

Насколько я понимаю, pthread_exit() точно соответствует возврату, когда вам нужно завершить поток с возвращаемым значением. Когда люди могут использовать согласованный способ, т.е. Возвращать, выполнять работу, почему Pthread определяет такой дублированный интерфейс?

Ответ 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). Функция должна существовать, иначе у ядра не было бы способа определить, вышел ли поток.