Деструкторы C ++ и PTHREAD_CANCEL_ASYNCHRONOUS - PullRequest
1 голос
/ 05 июля 2011

Гарантируется ли выполнение деструкторов для автоматических объектов, если поток отменяется асинхронно?

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Технически я думаю, что это вопрос качества реализации: стандарт C ++ не касается потоков POSIX, а стандарт потоков POSIX - это привязка к языку C, которая не обращается к C ++.

Так что, в принципе, реализация C ++ могла бы сделать эту работу (она могла бы даже гарантировать это). На практике я бы удивился, если бы это работало с отложенным или асинхронным отменой.

1 голос
/ 06 июля 2011

Теоретически, он ДОЛЖЕН работать нормально, но его стоит протестировать на вашей платформе.

Отмена потока в конечном итоге приводит к вызову pthread_exit(), который, насколько я могу судить по поиску в Google, вызовет деструкторы.Он делает это, выбрасывая какое-то исключение «гарантировано необработанное» в оболочку потока, поэтому все ваши объекты на основе стека уничтожаются в правильном порядке.

См. эту страницу , например.И это сообщение в блоге :

При вызове pthread_exit () в C ++ он должен уничтожить все объекты, созданные в стеке.Этот процесс называется размоткой стека, и это именно то, что происходит, когда вы генерируете исключение.pthread_exit () использует эту функцию C ++ для очистки перед окончательным завершением потока.

Чтобы сделать это, pthread_exit () выдает неясное исключение и перехватывает его прямо перед прерыванием потока.Таким образом, он хорошо очищает все объекты.С другой стороны, ловить… становится невозможным.

1 голос
/ 05 июля 2011

Ваш вопрос плохо сформирован. В стандарте C ++ до C ++ 0x нет «потоков», и в C ++ 0x нет асинхронной отмены потоков. Так что нет ответа на ваш вопрос за пределами конкретной реализации C ++ и pthreads, которую вы используете.

Тем не менее, ответ на вашу реализацию, вероятно, "нет". (По крайней мере, я не знаю ни о каких реализациях, где ответ - да.)

[править]

Хорошо, поэтому мои знания устарели. В Linux, по крайней мере, с современной библиотекой потоков, стек обычно разворачивается (согласно ответу @ Roddy).

Однако все еще верно, что такое поведение не гарантируется никаким стандартом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...