首页 > 解决方案 > 我如何知道线程是否在 C++ 中停止?

问题描述

我做了一个测试来制作一个模拟下载的进度条。当 ProgressBar 显示时开始下载。

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();

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

解决方案


join如果线程已经完成不会抛出异常,它只会在join已经被调用或线程从未启动时抛出,您可以使用joinable. 以下内容绝不应引发异常join

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

推荐阅读