Подтвердить что ты не робот

Каков наилучший способ удаления объекта boost:: thread сразу после его завершения?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work));