如何使用lua c api创建lua协程?



如何使用lua c api创建lua协程并将其暴露给lua?

我正在为lua写一个c库,我想知道如何使用lua c api实现lua协程。我基本上想实现如下的东西,其中模块是用c编程语言编写的。

module = require("mymodule")
coroutine.resume(module.coroutine_function, ...)

下面的C代码产生字符串"Wonderfull"4倍。并返回字符串"End">

static int kfunction(lua_State* L, int status, lua_KContext ctx)
{
static int x = 0;

if (x < 3)
{
x++;
lua_pushfstring(L, "Wonderfull");
return lua_yieldk(L, 1, 0, kfunction);
}
lua_pushfstring(L, "End");
return 1;
}
static int iter(lua_State* L)
{
lua_pushfstring(L, "Wonderfull");
return lua_yieldk(L, 1, 0, kfunction);
}

int luaopen_module(lua_State* L) {
// initial function which is called when require("module") is run
lua_State* n = lua_newthread(L);
lua_setglobal(L, "coroutine_function");
lua_pushcfunction(n, iter);
return 0;
}
在Lua中使用C模块:
require("module")
print(coroutine.resume(coroutine_function))  -- true  Wonderfull
print(coroutine.resume(coroutine_function))  -- true  Wonderfull
print(coroutine.resume(coroutine_function))  -- true  Wonderfull
print(coroutine.resume(coroutine_function))  -- true  Wonderfull
print(coroutine.resume(coroutine_function))  -- true  End
print(coroutine.resume(coroutine_function))  -- false cannot resume dead coroutine
第一次调用coroutine.resume

时,调用int iter(lua_State* L)。后续呼叫int kfunction(lua_State* L, int status, lua_KContext ctx)

lua_yieldk的第4个参数可以作为Lua应该调用的下一个函数来获得下一个yield或返回值。

文档:处理C

最新更新