注意:下面有一些问题可以说明我的想法,但我正在寻找的唯一答案是标题中实际问题的答案。不是在这里要求“一本书”,也不是对所有这些的逐条回应。
我正在尝试从 C API 启动一个协程,让它产生,然后再继续(可能在从其他协程执行恢复之后)。这是一个相当简单的用例,但文档lua_resume()
非常混乱:
int lua_resume (lua_State *L, lua_State *from, int nargs);
在给定的线程 L 中启动和恢复协程。
要启动协程,您将 main 函数和任何参数压入线程堆栈;然后你调用 lua_resume,其中 nargs 是参数的数量。当协程挂起或完成执行时,此调用返回。当它返回时,堆栈包含所有传递给 lua_yield 的值,或所有由 body 函数返回的值。如果协程产生,lua_resume 返回 LUA_YIELD,如果协程完成执行而没有错误,则返回 LUA_OK,或者在错误的情况下返回错误代码(参见 lua_pcall)。
如果出现错误,堆栈不会展开,因此您可以在其上使用调试 API。错误消息位于堆栈顶部。
要恢复协程,您需要从最后一个 lua_yield 中删除所有结果,仅将要作为 yield 的结果传递的值放入其堆栈,然后调用 lua_resume。
参数from代表正在恢复L的协程。如果没有这样的协程,该参数可以为NULL。
“表示正在恢复 L 的协程”的含义在这里非常不清楚。究竟什么时候“来自”nil,哪个L
和哪个from
是“线程堆栈”,以及恢复协程的确切要求是什么?可以在初始状态和实际恢复的第二个状态L
之间修改状态吗?lua_resume()
如果是这样,该州如何知道在哪里/恢复什么功能?如果不是(即每个线程一个线程lua_State
),创建新线程的正确方法是什么,以便它与父线程共享执行上下文(全局、环境等),以及调用lua_resume()
和展开的正确方法是什么?在这种情况下要求每个开始/恢复?'from' 论点是否与这些事情有关?
最后,在任何一种情况下 - 我如何获得完整的堆栈跟踪以在错误处理程序中进行调试(例如在错误时调用lua_pcall
),它尊重/知道跨简历的调用?是否lua_getinfo()
通过简历正确报告?这就是“来自”论点的目的吗?
我真的很想要一个来自 C API 的协程启动/恢复的完整工作示例,该示例说明了第二个参数的使用。gist 上有这个例子,但是它已经有多年历史了,并且 API 从那时起发生了变化——lua_resume()
现在需要 3 个参数,而不是 2 个......