Ответ 1
Объекты с продолжительностью хранения потоков гарантированно уничтожаются только для потока, который вызывает exit
. Цитирование С++ 14 (N4140), [support.start.term] 18.5/8 (выделено мной):
[[noreturn]] void exit(int status)
Функция
exit()
имеет дополнительное поведение в этом международном стандарте:
- Во-первых, объекты с длительностью хранения потока и связаны с текущим потоком. Затем объекты со статической продолжительностью хранения уничтожаются и функции регистрируются путем вызова atexit называются. См. 3.6.3 для порядка разрушений и вызовов. (Автоматические объекты не уничтожен в результате вызова
exit()
.) Если элемент управления оставляет зарегистрированную функцию, вызваннуюexit
, потому что функция не предоставляет обработчик для исключенного броска,std::terminate()
должен быть вызван (15.5.1).- Далее, все открытые C-потоки (опосредуемые сигнатурами функций, объявленными в
<cstdio>
), с неписаные буферизованные данные очищаются, все открытые потоки C закрыты, и все файлы, созданные путем вызоваtmpfile()
удаляются.- Наконец, управление возвращается в среду хоста. Если статус равен нулю или
EXIT_SUCCESS
, возвращается форма успешного завершения статуса. Если статусEXIT_FAILURE
, возвращается форма безуспешного завершения состояния, определяемая реализацией. В противном случае возвращаемый статус определяется реализацией.
Таким образом, стандарт не гарантирует уничтожения объектов с продолжительностью хранения потоков, связанных с другими потоками, чем тот, который вызывает exit
.