std :: поток освобождает от внутренней функции потока - PullRequest
1 голос
/ 15 апреля 2019

Типичным рабочим потоком является:

std::thread t([](){

  ....
 });
t.join();

Есть ли способ отсоединить поток (поэтому join должен вернуться) изнутри функции потока?Таким образом, поток «отсоединен», и код после t.join() продолжает работать, и функция потока также продолжает работать.

Я мог бы сделать это в Windows с SetEvent, но я ищу стандартное решение.

1 Ответ

0 голосов
/ 16 апреля 2019

Как это сделать

Функция, которую выполняет поток, должна иметь ссылку на поток.Если у него есть ссылка на поток, он может просто вызвать 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...