You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::launch::deferred是否创建新线程?非线程安全Lua代码使用安全问询

关于std::launch::deferred的线程安全与实现类比问题

我有一段非线程安全的Lua代码,希望通过延迟异步(类似延迟Promise)模拟异步操作。请问使用std::launch::deferred并在同一线程调用wait是否安全?
另外,deferred async是否类似于如下实现:

struct deferred_function {
  std::function<void()> fn;

  bool executed = false;

  void wait() {
    if (!executed) {
      fn();
      executed = true;
    }
  }
};

template<class T> auto create_deferred(T&& fn) {
    return deferred_function{ .fn = fn };
}

auto d1 = create_deferred([]() {
  std::cout << "Call 1d\n";
});

auto d2 = create_deferred([&d1]() {
  d1.wait();
  std::cout << "Call d2\n";
});

// 由于d2内部会等待d1执行完成,这里wait的顺序不影响最终执行结果
d2.wait();
d1.wait();

问题解答

1. 同一线程调用std::launch::deferred任务的wait()是否安全?

完全安全,非常适配你的非线程安全Lua代码场景:

  • std::launch::deferred标记的异步任务不会在创建时执行,只会在第一次调用wait()或get()时,在当前调用线程内同步执行
  • 整个执行流程都在单线程中完成,不会引入多线程并发访问,彻底避免了非线程安全代码的竞争风险
  • 任务只会被执行一次,后续的wait()/get()调用直接返回结果,不会重复触发执行

2. 与自定义deferred_function的实现对比

你的自定义实现和标准库std::launch::deferred的核心逻辑高度一致:

  • 都是延迟触发执行:任务在创建阶段不运行,直到显式调用wait()(标准库对应wait()/get())才执行
  • 都保证任务仅执行一次:通过状态标记(你的executed变量)避免重复执行
  • 执行上下文相同:都在触发任务的线程内同步完成,没有额外线程开销

不过标准库的实现更完善:

  • 支持返回值传递和异常捕获(你的实现仅支持无返回值的函数)
  • 多线程安全:如果多个线程同时调用wait(),标准库会保证任务仅执行一次且无数据竞争,而你的自定义实现未处理多线程并发调用的情况
  • 兼容std::future体系:可以和其他异步任务组合、链式调用,接口更丰富

内容的提问来源于stack exchange,提问作者Gasim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:36