繁体   English   中英

可以重置 std::call_once 吗?

[英]Can std::call_once be reset?

不久前我写了一个 function,基于虚幻引擎 4 的蓝图实现,它只调用一次可调用对象,直到它被重置:

template<typename Callable>
void DoOnce(Callable&& f, bool reset = false, bool start_closed = false) noexcept {
    static bool once = start_closed;
    if(!once) {
        once = true;
        std::invoke(f);
    }
    if(reset) {
        once = false;
    }
}

今天我了解到std::call_once存在,可以跨线程工作,可以使用具有 arguments 的可调用对象,测试异常安全性,并且基本上像我的那样围绕std::invoke进行操作(至少是 MSVC 实现)。

这听起来很棒,并且在可能的情况下,我更喜欢调用预先存在的 function 而不是自己编写。

就像虚幻的文档所暗示的那样,有时我可能需要通过重置内部标志来再次调用可调用对象; 可以重置std::call_once以允许再次调用底层可调用对象吗?

当他们称其为“once_flag”时,该标准并不是在开玩笑。 这是一个只设置一次的标志。

您当然可以使用不同的一次性标志对象多次调用 function。 但要正确执行此操作,您需要将每个可能试图将其称为新的一次性标志 object 的线程交给它。 它不能只是全局或 static object 某处; 您实际上必须将每个新调用编组到所有想要调用它的线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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