gpt4 book ai didi

c++ - std::thread::join 无限期地阻塞在 main 之外

转载 作者:太空狗 更新时间:2023-10-29 20:55:24 26 4
gpt4 key购买 nike

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 是同一个问题吗? ?

最佳答案

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

关于c++ - std::thread::join 无限期地阻塞在 main 之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35774107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com