gpt4 book ai didi

c - C 中的简单 lua_yield 无法从 Lua 正确恢复

转载 作者:行者123 更新时间:2023-12-04 02:25:33 27 4
gpt4 key购买 nike

我刚刚开始使用 C 深入研究 lua 协程,我对我认为应该是我能想到的最简单的示例有疑问。

C:

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdlib.h>

static int lua_test_yield(lua_State *L) {
printf("1\n");
lua_yield(L, 0);
printf("2\n");
lua_yield(L, 0);
printf("3\n");
lua_yield(L, 0);
printf("4\n");
lua_yield(L, 0);
printf("5\n");
lua_yield(L, 0);
return 0;
}

static const struct luaL_Reg mylib[] = {
{"test_yield", lua_test_yield},

{NULL, NULL}
};

// Used when the .so library is loaded from lua
int luaopen_mytest(lua_State *L) {
luaL_newlib(L, mylib);
return 1;
}

路亚

mytest = require 'mytest'

print("Loaded")
mytest_yeild = coroutine.create(function ()
mytest.test_yield()
end)

for i=1,5 do
print(coroutine.resume(mytest_yeild))
end

结果:

$ lua test.lua 
Loaded
1
true
true
false cannot resume dead coroutine
false cannot resume dead coroutine
false cannot resume dead coroutine

我觉得这很奇怪。为什么报两次成功的resume却什么都不打印,然后又报失败的resume?我在这里错过了什么?谢谢。

最佳答案

要在屈服后返回到 C 代码,您需要使用 lua_yieldk 并在单独的 C 函数中获取它,如下所示:

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdlib.h>

static int lua_test_yield_6(lua_State *L, int status, lua_KContext ctx) {
return 0;
}

static int lua_test_yield_5(lua_State *L, int status, lua_KContext ctx) {
printf("5\n");
return lua_yieldk(L, 0, 0, lua_test_yield_6);
}

static int lua_test_yield_4(lua_State *L, int status, lua_KContext ctx) {
printf("4\n");
return lua_yieldk(L, 0, 0, lua_test_yield_5);
}

static int lua_test_yield_3(lua_State *L, int status, lua_KContext ctx) {
printf("3\n");
return lua_yieldk(L, 0, 0, lua_test_yield_4);
}

static int lua_test_yield_2(lua_State *L, int status, lua_KContext ctx) {
printf("2\n");
return lua_yieldk(L, 0, 0, lua_test_yield_3);
}

static int lua_test_yield_1(lua_State *L) {
printf("1\n");
return lua_yieldk(L, 0, 0, lua_test_yield_2);
}

static const struct luaL_Reg mylib[] = {
{"test_yield", lua_test_yield_1},

{NULL, NULL}
};

// Used when the .so library is loaded from lua
int luaopen_mytest(lua_State *L) {
luaL_newlib(L, mylib);
return 1;
}

关于c - C 中的简单 lua_yield 无法从 Lua 正确恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67959822/

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