#c #windows #multithreading #process #boost-thread
#c #Windows #многопоточность #процесс #boost-поток
Вопрос:
В моей программе у меня есть статический объект, который создает boost::thread . Предполагается, что поток будет выполняться до завершения программы, но он не должен завершаться в случайном состоянии, поэтому я реализовал управляемое завершение потока в деструкторе этого статического объекта. Проблема в том, что когда main() завершается, мой поток завершается до вызова деструктора.
Теперь вопрос: возможно ли предотвратить уничтожение потока? Или, по крайней мере, задержите это, чтобы это произошло после вызова деструктора?
Комментарии:
1. Запуск потоков перед вводом
main
несколько опасен, разве вы не можете просто переместить этот объект / изменить свой дизайн?2. Поток создается после ввода
main
. Статический объект не является глобальным; он находится в статическом методе get() класса (singleton).
Ответ №1:
Переместите завершение из деструктора в функцию и просто вызовите ее перед завершением main.
Комментарии:
1. Я бы предпочел, чтобы моя библиотека отвечала за очистку, а не перекладывала эту ответственность на своих пользователей. Это создало бы пространство для незначительных ошибок.
2. @Tomasz Grobelny: Используйте
std::atexit
then.3. Полагаться на статический деструктор не очень хорошо. Если ваша библиотека реализована как dll, загрузка / выгрузка вызовет конструктор / деструктор статического объекта. Лучшим вариантом является предоставление пользователю полного контроля. Стандарт C не говорит о статических деструкторах объектов и о том, как они ведут себя с потоками
4. Возможно, я ошибаюсь, но в стандарте IIRC говорится, что деструкторы должны выполняться в обратном порядке, чем конструкторы. Конечно, в нем не указано, что происходит с потоками — это, очевидно, деталь реализации, которая, по-видимому, работает по-разному в Windows / Unix. Итак, вопрос в том, как заставить код работать в Windows так же, как и в Unix. То есть: не заботьтесь о потоках, пока не будет выполнен весь стандартный код C (в частности, деструктор).
5. @K-ballo: К сожалению
atexit
, работает не так, как ожидалось. И, похоже, с этим ничего нельзя поделать: blogs.msdn.com/b/oldnewthing/archive/2007/05/03/2383346.aspx