2016-02-04 4 views
3

Создаю объект new std :: thread, а затем detach(). Нить выполняется в течение произвольного промежутка времени, а затем завершается. Так как я создал объект с new, мне нужно до delete его в какой-то момент, чтобы высвободить свои ресурсы? Или собственно нить эффективно delete по окончании?Отключен ли std :: thread после его завершения?

Если это действительно эффективно delete, произойдет что-то плохое, если я явно delete после его окончания?

+3

Будьте осторожны, вы используете слово «это», и иногда трудно сказать, означает сам поток или объект std :: thread. –

+2

Хороший способ запустить отдельный поток: 'std :: thread (f, a0, a1, ...). Detach();' Нет необходимости его обновлять. Не нужно удалять его. Нет шансов забыть «отсоединить»() 'it. У вас нет шансов на исключение исключения между вашей конструкцией и точкой отсоединения. –

+0

@DavidSchwartz не уверен, что я понимаю - почему поток и объект std :: thread разные? –

ответ

6

Да, вы должны delete его самостоятельно.

После того, как вы вызвали std::thread::detach, поток будет отделен от объекта нити и разрешить выполнение для продолжения независимо, а затем объект потока больше не будет иметь ни одного потока. Таким образом, нить не будет и невозможна до delete после ее окончания.

1

Каждый объект в C++, выделенный с использованием new, должен быть освобожден с использованием delete.

Тема представляет собой объект, «расположенный в ОС» (обычно). Он создается с использованием конструктора std::thread и выпущен с detach().

Объект класса std::thread является объектом С ++, связанным с потоком.

Итак, вы должны освободить оба объекта ОС и объект C++.


Обновление. Когда вы создаете поток, ОС выделяет внутренние структуры в пределах kernelspace для управления им. Существует множество свойств, связанных с каждым потоком, как состояние (работающий, ожидающий, ожидающий ресурс), приоритет, код возврата и т. Д.

+0

Спасибо. Можете ли вы рассказать о том, что такое объект «находится внутри OS»? Я предполагаю, что это связано с комментарием @ DavidSchwartz? –

+0

@Stuart Barth Обновлен ответ –

Смежные вопросы