繁体   English   中英

std :: thread不退出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM