Я хотел бы, чтобы объект Boost Thread удалялся вместе с выходом из функции входа потока. Что-то не так, если я запускаю функцию потока и передаю общий указатель на объект, которому принадлежит экземпляр объекта потока, а затем, когда функция потока завершается, он одновременно уничтожает объект this вместе с объектом потока?
РЕДАКТИРОВАТЬ:
Может быть, я опишу, почему я хочу это сделать. Я должен использовать API низкого уровня dbus. Я хочу создать класс адаптера, который запустит свой собственный поток и будет ждать входящих сообщений, пока не придет сообщение DISCONNECT. Если он прибудет, я хочу закрыть поток и убить сам адаптер. Адаптер — это активный объект, который запускает метод, отправленный его планировщику. Эти методы снова помещаются в очередь планировщика после чтения сообщения из dbus. Но если это сообщение DISCONNECT, они не должны отправлять метод, а просто выходить из потока планировщика, уничтожая объект Adapter. хммм похоже, это слишком сложно …
От документация Boost.Thread Вы можете видеть, что объект потока, который является присоединяемым, не должен быть удален, в противном случае std::terminate
будет называться.
Таким образом, вы должны убедиться, что если поток является присоединяемым, либо join()
или же detach()
должен вызываться в деструкторе объекта, владеющего потоком. Замечания: если сам поток уничтожает объект, join()
это не вариант. Поток попытается присоединиться, что приведет к тупику.
Однако, если вы помните об этих ограничениях, вы можете уничтожить поток из его собственного потока выполнения.
Вы можете сделать это, но вы, вероятно, не должны.
Основное назначение boost::thread
Объект в том, что вы можете контролировать связанный поток. Наличие самого монитора потоков не имеет большого смысла в большинстве сценариев.
Как было предложено другими ответами, вы могли бы просто detach
нить и бросить boost::thread
возразить Это обычно считается плохим стилем, если ответственность за мониторинг не была передана другому объекту. Например, многие простые рабочие потоки устанавливают будущее после завершения. Будущее уже обеспечивает весь необходимый нам мониторинг, поэтому мы можем отсоединить поток.
Вы никогда не должны полностью отсоединять поток, чтобы потерять все средства для его мониторинга. Вы должны по крайней мере быть в состоянии гарантировать чистое отключение, которое становится невозможным для всех, кроме самых тривиальных нитей, если вы полностью отсоедините их.
Я не уверен, что это касается вашего варианта использования, но для меня это звучит так, будто вам не нужно этого делать.
Время жизни объекта boost :: thread не обязательно совпадает с самим потоком. Это означает, что если вам все равно, вы можете просто запустить поток, вызвать для него detach () и вывести объект из области видимости. Затем он удаляется, но поток все равно будет работать, пока его функция не будет завершена. Единственное, вы не сможете присоединиться к нему. Поэтому, если ваша программа завершает работу, пока поток все еще работает, она завершится сбоем.
В случае, если вы заботитесь об этом, вопрос может быть неправильным, потому что в этом случае вы сохраните объекты и вызовете join () для них перед удалением.