2016-04-07 7 views

ответ

3

Выполнены ли функции, зарегистрированные с помощью atexit(), последними функциями, которые должны быть выполнены ?

Звонки atexit() будут выполняться в основном потоке после завершения основного потока. Помимо этого, никаких гарантий не предусмотрено.

Возможно ли, что другие потоки в это время все еще работают?

Да, если вы не предприняли шаги, чтобы остановить другие потоки и присоединиться к ним, прежде чем main() вернется. В общем, вы хотите сделать явное контролируемое завершение всех ваших потоков, поскольку среда выполнения C (или C++) не сделает этого за вас, и позволяет им продолжать работать, даже когда поток main() выходит из этой возможности. что они попытаются получить доступ к ресурсам, которые main() освободил как часть последовательности его выключения, что вызовет неопределенное поведение (часто возникающее как случайный, нелегко-воспроизводимый сбой во время выключения программы)

+1

Я думаю, это не так правда. atexit() вызывается при вызове exit(). Вы можете получить свой основной поток pthread_exit, а остальные потоки продолжатся, пока один из них не вызовет exit(). –

+0

Кто сказал, что они "C++ threads"? 'atexit()' может быть версией C, но я не знаю, есть ли различия в спецификациях, не говоря уже о реализациях! – PJTraill

+0

@PJTraill Вы правы, я изменю свой ответ, чтобы это отразить. –