我如何知道线程是否在C ++中停止?

时间:2019-06-13 04:07:45

标签: c++ multithreading c++11 thread-safety

我进行了测试,制作了一个用于模拟下载的进度条。显示进度条时开始下载。

void CProgressBarTest::DoDataExchange(CDataExchange* pDX)
{
...
    auto funDownloadCallback = [&](int i)->int {
        if (m_downloadStopFlag)
        {
            return -1;
        }
        m_progress_bar.SetPos(i);
        return i;
    };
    std::thread thDownload(__HeavyWork::SimulateDownload, funDownloadCallback);
    thDownload.swap(m_thDownload);
}

在单击取消按钮或关闭窗口时停止下载。

void CProgressBarTest::OnClose()
{
    m_downloadStopFlag = true;
    m_thDownload.join();//How do I know if the thread alread stopped. If the thread stopped, it would crash.
    CDialog::OnClose();
}

在这里,我使用一个标志(m_downloadStopFlag)告诉线程停止。并使用m_thDownload.join();等待线程停止。停止下载效果很好。

但是,如果我等待下载完成(线程也完成了),我将关闭此对话框,并且仍然会调用m_thDownload.join();,这会导致崩溃。

我如何知道线程是否完成,然后可以跳过m_thDownload.join();

1 个答案:

答案 0 :(得分:1)

join不会在线程已完成的情况下引发异常,仅在调用join或从未启动线程时才会引发异常,您可以使用{{ 3}}。以下内容永远不会引发join的异常:

if (thread.joinable())
{
  thread.join();
}