std :: thread :: join无限期地阻塞了main

时间:2016-03-03 13:54:02

标签: c++ multithreading c++11

即使退出线程例程,

std::thread::join也不会返回。

猜猜,我有一节课。

class A
{
public:
    A()
    {
        this->thr = std::thread(&A::foo, this);
    }
    ~A()
    {
        this->join();
    }
    void join()
    {
        this->cond.notify_all();
        if (this->thr.joinable())
        {
            this->thr.join();
        }
    }

private:
    void foo()
    {
        std::mutex mtx;
        std::unique_lock<std::mutex> lck(mtx);
        this->cond.wait(lck);
        MessageBox(L"I'm done!");
    }

private:
    std::thread thr;
    std::condition_variable cond;
};

我的应用程序包含A的唯一实例。这是一个全球变量。 如果从析构函数调用A::joinstd::thread::join将永久阻止。 如果我手动拨打A::join(例如在退出main之前),一切都会正常。

我的main看起来像这样:

A a;
int main()
{
    auto timeout = std::chrono::seconds(3);
    std::this_thread::sleep_for(timeout);

    // a.join();
}

顺便说一下,MessageBox总是被执行。

问题与here相同吗?

2 个答案:

答案 0 :(得分:3)

是的,它与引用的链接中的错误相同,因为您的示例也会挂起_Thrd_join。您可能会对this question感兴趣,其中包含更详细的分析。

答案 1 :(得分:1)

来自你的评论

  

&#34;它似乎不是一个很好的解决方案。我工作,但如果主要   是不是那么琐碎?有很多不同的退出方式   应用。因此,每次我都必须手动加入我的线程   需要吗?&#34;

如何在主要内容中创建一个std :: unique_ptr。这样,无论你的主要退出方式如何,它在退出main()之前总会摧毁A并且你不会遇到这个问题。