Как это сделать
Функция, которую выполняет поток, должна иметь ссылку на поток.Если у него есть ссылка на поток, он может просто вызвать detach
для этой ссылки.
Есть два способа сделать это с лямбдами.
Захватить нить по ссылке. Мы можем передать лямбда-нить самой нити, перехватить нить по ссылке:
std::thread myThread([&]() {
myThread.detach();
});
Передать нить влямбда в качестве входных данных.
Мы можем передавать ссылки на функцию, которую используем для запуска потока, следующим образом:
auto myFunc = [](std::thread& myThread) {
myThread.detach();
};
// Pass a reference to yourself:
std::thread t(myFunc, std::ref(t));
Здесь мы передаем ссылку на поток вmyFunc
, и он отсоединяет поток после его запуска.Мы должны использовать std::ref
, который происходит от <utility>
, потому что потоки копируют аргументы, использованные для их запуска , если эти аргументы не передаются как reference_wrapper.
Использование std::shared_ptr
для предотвращения выпадения объекта потока из области видимости до вызова detach
Эти методы будут работать, только если myThread
все еще находится в области действия к моменту, когда потокнаконец выполняет.Если myThread
выпал из области видимости, это сделает недействительной ссылку и, вероятно, приведет к сбою программы.
Я рекомендую использовать что-то вроде shared_ptr
, чтобы обойти это:
auto myFunc = [](std::shared_ptr<std::thread> myThread) {
myThread->detach();
};
std::shared_ptr<std::thread> t_ptr(new std::thread(myFunc, t_ptr));