ускорение очистки потоков и процессов в Windows

#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