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
相关产品推荐
相关产品推荐

