gpt4 book ai didi

c++ - 等待 std::thread 完成

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:28 27 4
gpt4 key购买 nike

我正在尝试在程序终止时优雅地清理,所以我正在调用 join()std::thread 上等待它完成。这似乎永远阻塞了主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:

void GameLoop::Run()
{
while (run)
{
// Do stuff...
}
std::cout << "Ending thread...\n";
}

我正在设置 runjoin之前为假荷兰国际集团,当然。现在,我怀疑它与作为成员函数并在对象销毁 时被调用有关。我正在创建这样的线程:runThread.reset(new thread(&GameLoop::Run, this)); , 其中runThreadunique_ptr<std::thread>GameLoop 的成员. join()调用来自 GameLoop 的析构函数目的。

如果循环线程的对象正在被销毁,循环线程可能无法完成?根据调试器的说法,循环线程在 msvcr120d.dll 的黑暗深处徘徊。 .如果是这样,你会如何处理?

注意:std::thread 的新手在这里!

更新:这是我加入析构函数的调用:

run = false;
if (runThread->joinable())
{
runThread->join();
}

更新 2: 如果我删除 join()我收到 ~thread() 引发的异常!

最佳答案

当然,当您加入 一个线程时,不会导致该线程终止。它只是阻塞,直到该线程死于自然(或非自然)原因。

为了优雅地清理多线程应用程序,您需要以某种方式告诉工作线程该死了,然后等待死亡发生。 “等待死亡发生”部分是 join 的目的。

关于c++ - 等待 std::thread 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19962025/

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