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

如何在C++中通过sol2(v3.3.0)正确运行Lua协程?

在C++中使用sol2正确运行Lua协程的解决方法

你遇到的问题核心是直接将sol::function转换为sol::coroutine无法正确初始化协程上下文,导致调用co()时没有执行预期逻辑。以下是两种可行的解决方案:

方案一:Lua侧预先创建协程再传入C++

在Lua代码中,先通过coroutine.create()将函数包装为协程对象,再传递给C的run_coroutine函数。C侧直接接收sol::coroutine类型并调用即可:

#include <sol/sol.hpp>

int main() {
    sol::state lua;
    lua.open_libraries(sol::lib::base);

    lua.set_function("run_coroutine", [](sol::coroutine co) {
        co(); // 执行到第一个yield,输出"1"
        co(); // 恢复执行到第二个yield,输出"2"
        co(); // 恢复执行完成,输出"3"
    });

    lua.script(R"(
        function story()
            print("1")
            coroutine.yield()
            print("2")
            coroutine.yield()
            print("3")
        end

        // 将函数包装为协程后传入
        run_coroutine(coroutine.create(story))
    )");
}

方案二:C++侧手动将函数包装为协程

如果不想修改Lua侧代码,可以在C++中通过sol::coroutine的构造函数,传入Lua状态和函数对象,手动初始化协程上下文:

#include <sol/sol.hpp>

int main() {
    sol::state lua;
    lua.open_libraries(sol::lib::base);

    lua.set_function("run_coroutine", [&lua](sol::function func) {
        // 传入Lua状态和函数,正确创建协程对象
        sol::coroutine co(lua.lua_state(), func);
        co();
        co();
        co();
    });

    lua.script(R"(
        function story()
            print("1")
            coroutine.yield()
            print("2")
            coroutine.yield()
            print("3")
        end

        run_coroutine(story)
    )");
}

为什么原代码不工作?

原代码中sol::coroutine co = func;只是做了类型转换,并没有为函数创建新的协程执行上下文。Lua协程需要明确的初始化步骤(无论是Lua侧的coroutine.create还是C++侧通过Lua状态构造),才能在调用co()时正确执行协程逻辑并响应yield。

两种方案执行后都会输出预期结果:

1
2
3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:57:07