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

2024-01-10

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

The 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;
}

The Lua

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

我觉得这真的很奇怪。为什么它报告两次成功的简历但不打印任何内容然后报告失败的简历?我在这里缺少什么?谢谢。


要在让出后返回到 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中的简单 lua_yield 无法从 Lua 正确恢复 的相关文章

随机推荐

  • 我们可以从 Visual Studio 任务运行器资源管理器运行 npm start

    我正在 Visual Studio 中设置 Angular 4 代码 我可以从 Visual Studio 成功构建 但是如果我想启动角度代码 我会进入命令提示符并手动输入npm start运行应用程序 运行后npm start 我使用注册
  • SQLAlchemy 中的元数据到底是什么?

    元数据 SQLAlchemy 到底是什么 我很难理解这一点 元数据和引擎有什么区别 元数据是表定义的集合 引擎是特定数据库的方言和连接详细信息 以及保存已与该数据库建立的任何连接的连接池
  • 如何更改 Umbraco 中的 URL 名称

    这是我第一次使用 Umbraco 我使用错误的命名格式创建了文档类型 页面 现在这已经变成了我的页面 URL 例如 about page 我该如何将它们更改为 about因为我搜索了后端管理面板 似乎没有一个选项可以更改他们的link to
  • 在 .rc 文件中设置发布者字段

    我收到这样的消息 我需要在 rc 资源文件 中设置我的发布者名称才能在此窗口中显示它 您需要设置您的 FileDescription 和 CompanyName 字段版本资源 http msdn microsoft com en us li
  • 尊重代码中的空间但忽略 CSS?

    使用CSS我可以让浏览器忽略 nbsp 字符但尊重正常的空白 So this Some text nbsp nbsp More text 显示如下 一些文字 更多文字 Not 一些文字 更多文字 更新我的代码中实际上有更多的空白 我需要默认
  • Android 意图让 SD 卡准备就绪

    我有一个使用 SD 卡上的文件的应用程序 该应用程序在手机启动时运行 并且很明显 当该程序首次运行时无法访问该文件 因为它在 SD 卡可用之前开始工作 是否有广播接收器可以用来告知 SD 卡何时准备就绪 Update 只是总结一下注册意图的
  • 如何在绘图表达散点图中只有一条多种颜色的趋势线?

    我想创建一个只有一条趋势线的散点图 Plotly Express 为点列表中的每种颜色创建不同的趋势线 import plotly express as px value 15 20 35 40 48 years 2010 2011 201
  • EA14.0 中的“覆盖属性初始值设定项”行为更改为 EA12.5 中的“设置运行状态”

    我观察到 EA14 0 中的行为与 EA12 5 中的行为有所不同 Summary 在 EA12 5 中使用时Deployment Specification必须设置Instance Classifier on the Deployment
  • Protractor:Protractor 中的ignoreSynchronization 和async/await 有什么区别

    我是量角器的新手 我正在做测试来熟悉它 在这里 我遇到了一个问题 我无法区分ignoreSynchronization和async await方法 我有 3 个区块来测试它们 第一个是量角器自己的异步功能 it without await
  • https 在 Fiddler 和 .NET 中给出 ERR_CONNECTION_RESET

    谁能向我解释一下为什么在 Chrome 中输入此链接 https secure malindoair com MalindoAirCIBE OnlineBooking aspx https secure malindoair com Mal
  • MVC3 默认模板在哪里存储用户帐户信息?

    你能告诉我当我注册新帐户时 asp net mvc3默认模板将登录信息存储在哪里吗 它在调试模式下本地运行 在没有安装SQLExpress的情况下 注册功能根本不起作用 由于我安装了它 所以我可以使用注册 登录功能 但我在SQLExpres
  • stdin 上的 close/fclose 是否保证正确?

    似乎以下调用执行了您所期望的操作 关闭流并不允许任何进一步的输入 等待流上的输入的任何操作都会返回错误 但它是否保证在所有编译器 平台上都是正确的 close fileno stdin fclose stdin fclose stdin 导
  • .val() 未从输入获取更新值

    我有两个输入字段 我试图通过单击按钮使用 jquery 获取它们的值 这似乎是一个非常简单的操作 但我一生都无法让它发挥作用 这是代码片段 Name
  • 累加值,例如通过扫描,但可以随着时间的推移重置累加器

    我有一个可观察的 obs1 它代表一段时间内的数字流 我需要累积这些数字的总和并逐步发出它 即 很长一段路要说我需要使用scan操作员 然后是第二个 Observable obs2 代表某种 重置时间 换句话说 当obs2发出 我必须重置我
  • Opengl 深度缓冲区和剔除

    OpenGL 中使用背面剔除和深度缓冲区有什么区别 背面剔除是指 OpenGL 确定哪些面背对观看者 因此不可见 想象一个立方体 无论你如何旋转立方体 三个面始终是不可见的 找出这些面是哪些面 将它们从要绘制的多边形列表中删除 这样您就将绘
  • 打开 QDialog 并保存最后的状态

    我正在尝试打开一个QDialog from a QMainWindow 并且在关闭 QDialog之后 如果我需要再次打开它 它必须打开并显示与我关闭它时相同的信息 这是代码QMainWindow class A QMainWindow d
  • 从 Azure DevOps Python Artifacts feed 进行 pip 安装不起作用

    当我尝试从 Azure DevOps Artifacts feed 安装包时 出现错误 Looking in indexes https pypi org simple https pkgs dev azure com company co
  • 如何将可变数量的参数传递给 lambda 函数

    我正在尝试将可变数量的参数传递给 lambda 函数 lambda 函数中接受可变数量参数的原型是什么 我应该写一个命名函数而不是 lambda 吗 std once flag flag template
  • 适用于所有 Android 设备的 Android Badger

    你好 我有 android 应用程序 我需要将 badger 添加到应用程序启动器我在互联网上搜索并找到了这个库 compile me leolin ShortcutBadger 1 1 4 aar 可以工作 但不适用于我在三星和 HTC
  • C 中的简单 lua_yield 无法从 Lua 正确恢复

    我刚刚开始深入研究 lua 协程与 C 我对我认为应该是我能想到的最简单的例子有疑问 The C include