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::join
,std::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相同吗?
答案 0 :(得分:3)
是的,它与引用的链接中的错误相同,因为您的示例也会挂起_Thrd_join
。您可能会对this question感兴趣,其中包含更详细的分析。
答案 1 :(得分:1)
来自你的评论
&#34;它似乎不是一个很好的解决方案。我工作,但如果主要 是不是那么琐碎?有很多不同的退出方式 应用。因此,每次我都必须手动加入我的线程 需要吗?&#34;
如何在主要内容中创建一个std :: unique_ptr。这样,无论你的主要退出方式如何,它在退出main()之前总会摧毁A并且你不会遇到这个问题。