将来可以安全地传递到分离线程吗?

sha*_*ane 6 c++ multithreading c++11

是否将a传递std::futurestd::thread安全操作的独立实例?我知道在下面,std::futureshared_ptr中的状态与共享std::promise。这是一个例子。

int main()
{
    std::promise<void> p;
    std::thread( [f = p.get_future()]() {
        if ( f.wait_for( std::chrono::seconds( 2 ) ) == std::future_status::ready ) 
        {
            return;
        }

        std::terminate();
    } ).detach();

    // wait for some operation

    p.set_value();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码中有一个潜在的错误情况,即在主线程退出之后执行lambda。主线程退出后,共享状态是否仍保留?

Igo*_*nik 2

[basic.start.term]/6如果在信号处理程序 (21.10) 中不允许使用标准库对象或函数,则在 (4.7) 完成具有静态存储持续时间的对象的销毁和执行注册之前不会std::atexit发生函数(21.5),程序有未定义的行为。

根据[basic.start.main]/5,从返回main具有调用的效果std::exit,它会销毁具有静态存储持续时间的对象并执行std::atexit注册的函数。因此,我相信您的示例表现出未定义的行为。