如何通过正在运行的线程正确退出主线程/从主线程返回?

在多线程C ++程序中,是否可以在并行执行过程中与其他正在运行的线程一起正确使用std::exit

换句话说,使用std::exit的前提是什么?

第三方库通常可以安全使用吗?

注意:调用std::exit与从main中的空白块返回相同:

int main(.....)
{ // nothing here
    {
        all the real code......
    }
    return 0;
}

备注:这里的重点是其他线程;显然,从main调用的所有函数返回后便能够return意味着所有局部变量都被正确地销毁了。即使在标准C ++中,也总是如此。这不是重点,因为这不是线程问题。

macrosl 回答:如何通过正在运行的线程正确退出主线程/从主线程返回?

您的前提是假的。您不需要使用std::exit来破坏内容的线程。来自cppreference

  

堆栈未解开:具有自动存储持续时间的变量的析构函数不会被调用。

因此,例如,这不会做正确的事情:

int main() {
    auto x = some_raii_type_that_writes_to_file_on_destruction("file.ext");
    std::exit();
}

通常从main返回时,然后...

  

通过return语句或到达函数结尾从主函数返回将执行正常的函数终止(以自动存储持续时间调用变量的析构函数),然后执行std :: exit并传递参数return语句的值(如果使用隐式return则为0)作为exit_code。

话虽这么说,std::exit仅将执行以下步骤(再次cppreference

  

1)与当前线程相关联的具有线程本地存储持续时间的对象的析构函数,具有静态存储持续时间的对象的析构函数以及向std :: atexit注册的函数同时执行,[...]      

2)所有C流都被冲洗并关闭

     

3)删除由std :: tmpfile创建的文件

     

4)控制权返回到主机环境。 [...]

考虑到堆栈未解绕(调用std::exit的线程均未解开),您不能期望某些第三方库以“安全”的方式运行。

本文链接:https://www.f2er.com/3033277.html

大家都在问