gpt4 book ai didi

c++ - std::thread 不退出

转载 作者:行者123 更新时间:2023-11-30 01:02:08 25 4
gpt4 key购买 nike

我有代码可以作为一种反空闲 CPU 状态。在笔记本电脑上,连接了一个 USB 摄像头,抓取图像,如果允许 CPU 进入空闲状态,我会丢失图像。由于我在相关系统上没有管理员权限,因此我运行了一个线程,它只是对一个整数执行愚蠢的++,以防止 CPU 处于空闲状态(并且 1 个核心处于 100% 使用率)。问题是,在有问题的系统上,代码永远不会存在。在我的开发系统上,代码将正常退出,在应用程序应该运行的系统上,它工作正常,但永远不会退出。

我在控制台得到的输出是

Setting bool to exit.
Reached join 1.
Reached join 2.

就是这样。退出不会发生,因此 AntiIdle 上的 join() 不会返回。为什么?在一个系统上,它是,而在另一个系统上,它没有。

bool g_ExitProgram = false;

void AntiIdle()
{
int32_t ch = 0;
while (!g_ExitProgram)
{
ch++;
}
}

main()
{
std::thread antiIdleThread(AntiIdle);
while (!g_ExitProgram)
{
if (_kbhit())
{
char ch = _getch();
switch (ch)
{
case 27:
printf("Setting bool to exit.\n");
g_ExitProgram = true; break;
default:
;
}
}
}

printf("Reached join 1.\n");
displayThread.join();
printf("Reached join 2.\n");
antiIdleThread.join();

printf("Exiting code.\n");
return 0;
}

编辑:注意,displayThread 具有完全相同的退出条件,只是中间有几个 sleeps(),等待下一张图像到达。

最佳答案

这是一场数据竞赛,因为您的全局标志上根本没有同步。

最简单的解决方案是将标志更改为 std::atomic_bool - 默认的顺序一致性将起作用,在这种情况下您可能不需要优化它。

documentation 而言,std::atomic 具有默认顺序一致性,或更宽松的 store(memory_order_release)/load(memory_order_acquire) 给你 release-acquire ordering

只是为了清楚起见,将标志设置为 volatile 并没有解决这个问题。它可能在 Java 中有效,但在 C++ 中无效,而且从未如此。如果您非常不幸,它似乎会工作足够长的时间给您带来麻烦。

关于c++ - std::thread 不退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739389/

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