Как проверить, работает ли отдельный std :: thread? - PullRequest
0 голосов
/ 21 ноября 2018

Для отдельного потока мы не можем использовать joinable(), и использование переменных bool кажется неправильным способом.Есть ли способ проверить, жив отделен ли поток и работает ли он?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Есть несколько способов справиться с этим.Если вы настроены на потоки, то вы можете использовать std::future<void>, чтобы определить, когда он вышел:

std::promise<void> promised_thread_exit;

std::future<void> thread_exited = promised_thread_exit.get_future();

std::thread(
  [] (std::promise<void> promised_thread_exit)
  {
    promised_thread_exit.set_value_at_thread_exit();
    DoBackgroundWork();
  },
  std::move(promised_thread_exit));
thread.detach();

// later...
thread_exited.get();

Однако это похоже на большую работу.A std::thread - довольно низкий уровень примитива.Если цель состоит в том, чтобы просто выполнить некоторую работу в фоновом режиме, то std::async является лучшим вариантом:

std::future<void> work_complete = std::async(std::launch::async, DoBackgroundWork());

// later...
work_complete.get();

В любом случае, если вам нужно проверить состояние работы без блокировки, вы можете выполнитьпоэтому, ожидая на future с таймаутом 0:

using namespace std::chrono_literals;

//...

if (work_complete.wait_for(0s) == std::future_status::ready)
{
  // work has finished
}

При этом проверка состояния, подобного этому, редко необходима.Если это так, то вам следует подумать, есть ли более простая альтернатива.

0 голосов
/ 21 ноября 2018

Вы можете использовать std::condition_variable, чтобы уведомить ваш основной поток о завершении отдельного потока:

#include <iostream>
#include <mutex>
#include <thread>

int main()
{
    std::mutex mutex;
    std::condition_variable cv;

    std::thread t([&]() {
        std::cout << "Wait" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        std::unique_lock<std::mutex> lock(mutex);
        std::cout << "Thread end" << std::endl;

        cv.notify_all();
    });

    t.detach();

    std::unique_lock<std::mutex> lock(mutex);
    cv.wait(lock);

    std::cout << "Main end" << std::endl;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...