Являются ли функции, зарегистрированные с помощью atexit(), последними выполняемыми функциями? Возможно ли, что другие потоки в это время все еще работают?Неужели atexit ждет, пока другие потоки умрут?
ответ
Выполнены ли функции, зарегистрированные с помощью atexit(), последними функциями, которые должны быть выполнены ?
Звонки atexit() будут выполняться в основном потоке после завершения основного потока. Помимо этого, никаких гарантий не предусмотрено.
Возможно ли, что другие потоки в это время все еще работают?
Да, если вы не предприняли шаги, чтобы остановить другие потоки и присоединиться к ним, прежде чем main() вернется. В общем, вы хотите сделать явное контролируемое завершение всех ваших потоков, поскольку среда выполнения C (или C++) не сделает этого за вас, и позволяет им продолжать работать, даже когда поток main() выходит из этой возможности. что они попытаются получить доступ к ресурсам, которые main() освободил как часть последовательности его выключения, что вызовет неопределенное поведение (часто возникающее как случайный, нелегко-воспроизводимый сбой во время выключения программы)
Я думаю, это не так правда. atexit() вызывается при вызове exit(). Вы можете получить свой основной поток pthread_exit, а остальные потоки продолжатся, пока один из них не вызовет exit(). –
Кто сказал, что они "C++ threads"? 'atexit()' может быть версией C, но я не знаю, есть ли различия в спецификациях, не говоря уже о реализациях! – PJTraill
@PJTraill Вы правы, я изменю свой ответ, чтобы это отразить. –