【发布时间】:2016-10-05 07:24:26
【问题描述】:
注意:下面有一些问题可以说明我的想法,但我要寻找的唯一答案是标题中实际问题的答案。不是在这里要求“一本书”,也不是对所有这些的逐条回复。
我正在尝试从 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() 是否通过简历正确报告?这就是 'from' 参数的用途吗?
我真的很想要一个完整的、工作的 C API 中的协程启动/恢复示例,它说明了第二个参数的使用。要点上有 this example,但它已经有多年历史了,并且 API 从那时起发生了变化 - lua_resume() 现在需要 3 个参数,而不是 2 个......
【问题讨论】:
-
你就这类事情问了太多方式的问题,不到一本书的章节就无法回答。
-
并非如此 - 以上所有问题都可以通过一个简单的、具有三参数格式的
lua_resume()示例来回答 - 我认为这不会占用一本书的章节。我想回答的问题仍然是“第二个参数的含义是什么”,其他问题只是为了说明为什么这很重要。