gpt4 book ai didi

c++ - 可以重置 std::call_once 吗?

转载 作者:行者123 更新时间:2023-12-04 17:18:59 24 4
gpt4 key购买 nike

前阵子写了一个函数,基于Unreal Engine 4's blueprint implementation , 调用一次可调用直到它被重置:

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存在,跨线程工作,使用带有参数的可调用对象,测试异常安全性,并且基本上像我一样环绕 std::invoke(至少是 MSVC 实现)。

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

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

最佳答案

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

当然,您可以使用不同的 once-flag 对象多次调用该函数。但是要正确地做到这一点,您需要将每个可能尝试调用它的线程交给新的一次性标志对象。它不能只是某处的全局或静态对象;您必须实际将每个新调用编码到所有想要调用它的线程。

关于c++ - 可以重置 std::call_once 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67293209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com