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