Гарантируется ли выполнение деструкторов для автоматических объектов, если поток отменяется асинхронно?
Деструкторы C++ и PTHREAD_CANCEL_ASYNCHRONOUS
- Это будет зависеть от вашей платформы и компилятора. Стандарт C++ не знает о существовании PThreads. Какую платформу и компилятор вы используете? 05.07.2011
- Вы должны быть более конкретными в вопросе. Какие автоматические объекты, какая система потоков, как вы отменяете поток? 05.07.2011
- Спасибо, Родди, это произошло из-за моего невежества, а не халатности. 06.07.2011
Ответы:
Теоретически он ДОЛЖЕН работать нормально, но его стоит протестировать на вашей платформе.
Отмена потока в конечном итоге приводит к вызову pthread_exit()
, который, насколько я могу судить по гуглю, вызовет деструкторы. Он делает это, выбрасывая какое-то «гарантированное необработанное» исключение на всем пути к оболочке потока, поэтому все ваши объекты на основе стека уничтожаются в правильном порядке.
См. эту страницу. пример. И эту запись в блоге:
При вызове pthread_exit() в C++ он должен уничтожить все объекты, созданные в стеке. Этот процесс называется раскруткой стека, и это именно то, что происходит, когда вы выдаете исключение. Функция pthread_exit() использует эту возможность C++ для очистки перед тем, как закрыть поток навсегда.
Для этого pthread_exit() генерирует какое-то неясное исключение и перехватывает его прямо перед тем, как отключить поток. Таким образом, он хорошо очищает все объекты. С другой стороны, поймать… становится невозможно.
Технически я думаю, что это вопрос качества реализации: стандарт C++ не касается потоков POSIX, а стандарт потоков POSIX представляет собой привязку языка C, которая не касается C++.
Так что, в принципе, реализация C++ могла бы заставить это работать (она могла бы даже гарантировать это). На практике я был бы удивлен, если бы это работало либо с отложенной, либо с асинхронной отменой.
Ваш вопрос некорректен. В стандартном C++ до C++0x нет «потоков», а в C++0x нет асинхронной отмены потоков. Таким образом, нет ответа на ваш вопрос вне конкретной реализации C++ и pthreads, которую вы используете.
Тем не менее, ответ на вашу реализацию, вероятно, «нет». (По крайней мере, я не знаю ни одной реализации, в которой ответ положительный.)
[редактировать]
Хорошо, значит, мои знания устарели. В Linux, по крайней мере, с современной библиотекой потоков, стек обычно раскручивается (согласно ответу @Roddy).
Однако верно и то, что такое поведение не гарантируется никаким стандартом.