[英]std::thread does not exit
我有充当某种反空闲CPU状态的代码。 在笔记本电脑上,装有USB摄像头,可以抓取图像,如果允许CPU进入空闲状态,则会丢失图像。 由于我没有相关系统的管理员权限,因此我运行了一个仅对整数执行愚蠢++的线程,以保持CPU空闲(以及100%使用率的1个内核)。 问题是,在相关系统上,代码永远不会退出。 在我的开发系统上,代码将正常退出,在应运行应用程序的系统上,代码可以正常运行,但从不退出。
我在控制台中得到的输出是
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
默认顺序一致性将起作用,在这种情况下,您可能不需要对其进行优化。
在文档方面 ,具有默认顺序一致性的std::atomic
或更宽松的store(memory_order_release)
/ load(memory_order_acquire)
为您提供release-acquire排序 。
仅出于完全清楚的目的,使标志volatile
并不解决该问题 。 它可能适用于Java,但不适用于C ++,并且从未如此。 如果您很不幸,它似乎会工作很长时间,以至于给您带来麻烦。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.