Каков наилучший способ удаления объекта boost :: thread сразу после завершения его работы? - PullRequest
17 голосов
/ 19 октября 2010

Я создаю boost::thread объект с оператором new и продолжаю, не дожидаясь, пока этот поток завершит свою работу:

void do_work()
{
    // perform some i/o work
}

boost::thread *thread = new boost::thread(&do_work);

Я думаю, необходимо удалить thread, когда работа будет завершена,Каков наилучший способ без явного ожидания завершения потока?

Ответы [ 4 ]

20 голосов
/ 19 октября 2010

Время жизни объекта boost::thread и время жизни собственного потока не связаны.boost::thread объект может выйти из области видимости в любое время.

Из boost::thread class документации

Так же, как время жизни файла можетотличаться от времени жизни объекта iostream, который представляет файл, время жизни потока выполнения может отличаться от времени жизни объекта потока, который представляет поток выполнения.В частности, после вызова метода join () поток выполнения больше не будет существовать, даже если объект потока продолжает существовать до конца своего обычного времени жизни.Обратное также возможно;если объект потока уничтожается без вызова функции join (), поток выполнения продолжается до тех пор, пока не завершится его начальная функция.

Редактировать : если вам просто нужно запуститьнить и никогда не вызывать join, вы можете использовать конструктор потока как функцию:

    // Launch thread.
boost::thread(&do_work); 

Однако я не советую вам делать это, даже если вы думаете, что уверены, что поток завершитсядо main() делает.

13 голосов
/ 19 октября 2010

Вы можете использовать

boost::thread t(&do_work);
t.detach();

Как только поток отсоединен, он больше не принадлежит объекту boost::thread; объект может быть уничтожен, и поток продолжит работу. Деструктор boost::thread также вызывает detach(), если объект владеет работающим потоком, поэтому разрешение уничтожить t будет иметь тот же результат.

3 голосов
/ 20 октября 2010

Я предлагаю вам использовать boost :: shared_ptr, поэтому вам не нужно заботиться о том, когда удалять объект потока.

boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work));
0 голосов
/ 19 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...