lua_resume():第二个参数是什么意思?

lua_resume():第二个参数是什么意思?,lua,coroutine,c-api,Lua,Coroutine,C Api,注意:下面有一些问题说明了我的想法,但我要寻找的唯一答案是标题中实际问题的答案。不要在这里索要“一本书”,也不要逐条列出对所有这些的回应。 我试图从C API启动一个协同程序,让它屈服,然后在以后继续(可能是在执行其他协同程序的恢复之后)。这是一个相当简单的用例,但是lua\u resume()的文档非常混乱: int lua_resume(lua_State*L,lua_State*from,int nargs) 在给定的线程L中启动并恢复协同程序 要启动协同程序,将main函数plus推到线

注意:下面有一些问题说明了我的想法,但我要寻找的唯一答案是标题中实际问题的答案。不要在这里索要“一本书”,也不要逐条列出对所有这些的回应。

我试图从C API启动一个协同程序,让它屈服,然后在以后继续(可能是在执行其他协同程序的恢复之后)。这是一个相当简单的用例,但是
lua\u resume()
的文档非常混乱:

int lua_resume(lua_State*L,lua_State*from,int nargs)

在给定的线程L中启动并恢复协同程序

要启动协同程序,将main函数plus推到线程堆栈上 任何论据;然后你给lua_resume打电话,nargs是 论据。当协同路由挂起或完成其任务时,此调用返回 执行。当它返回时,堆栈包含传递给的所有值 lua_yield,或body函数返回的所有值。卢厄恢复返回 LUA_YIELD如果协同路由产生,LUA_OK如果协同路由完成其任务 无错误执行,或出现错误时显示错误代码(请参阅 卢厄(普卡尔)

如果出现错误,堆栈不会展开,因此可以使用调试API 越过它。错误消息位于堆栈的顶部

若要恢复协同程序,请从上一个lua_产量中删除任何结果,然后将 在其堆栈上,只有要作为yield的结果传递的值,然后 打电话给lua_resume

中的参数表示正在恢复L的协同程序。如果存在 没有这样的协同程序,此参数可以为NULL

这里“代表正在恢复L的协同程序”的含义非常不清楚。确切地说,当“from”为nil时,
L
from
中的哪一个是“线程堆栈”,恢复协同路由的确切要求是什么?是否可以在初始的
lua\u resume()
和实际正在恢复的第二个之间修改状态
L
?如果是,状态如何知道在哪里/恢复什么功能?如果不是(即每个
lua\u状态一个线程
),那么创建新线程的正确方法是什么,以便它与父线程共享执行上下文(全局、环境等),在这种情况下,调用
lua\u resume()
并取消对每个启动/恢复的调用的正确方法是什么?“from”论点是否与这些事情有关

最后,在这两种情况下,我如何在一个错误处理程序(例如从
lua\u pcall
错误调用)中获得调试的完整堆栈跟踪,该错误处理程序尊重/知道跨恢复的调用?
lua\u getinfo()
是否通过简历正确报告?这就是“来自”论点的目的吗

我真的想要一个完整的、可以工作的、来自C API的协同程序启动/恢复示例,该示例演示了第二个参数的使用。这里有一些要点,但它已经存在多年了,而且API从那时起已经改变了-
lua\u resume()
现在接受3个参数,而不是2个参数

当确切地说是“from”nil时,L和from中的哪一个是“线程堆栈”

如果您要询问来自参数的
的含义。只有在执行恢复的C函数本身是从协同程序中调用的情况下,才可以使用它

L
是将要恢复的参数推送到的堆栈(如果是初始恢复调用,则是启动函数)。因此,这将最适合术语“线程堆栈”

恢复协同程序的确切要求是什么

如中所述,如果线程的状态为
LUA\u OK
LUA\u YIELD
,则可以恢复线程

请注意,恢复线程和恢复协同程序之间有区别<代码>lua_resume
恢复线程。如果状态为
LUA\u OK
,则没有活动的协程,因此您正在创建一个新的协程,因此必须提供一个函数。如果线程是
LUA\u YIELD
,则恢复线程将恢复生成的协同程序

可以在初始lua_resume()和实际正在恢复的第二个lua_resume()之间修改状态L吗

当然可以,;一定是这样。毕竟,返回/收益值是推送到
L
上的值。当您要恢复它时,必须删除这些值并将新值作为Lua的
yield
函数返回的值推送到堆栈上

所以是的,你可以修改它。但是关于你能做什么是有规则的。其中两项:

规则#1:你不能戳不属于你的东西

假设Lua堆栈如下所示,就在您的初始简历之前(从左到右增长):

F
是您要启动的功能。1、2和3是参数。因此,您将3作为
nargs
传递<代码>A、
B
C
都是您放在堆栈上的任意内容

如果协同程序成功,则堆栈如下所示:

[A][B][C][LOTS OF STUFF][a][b][c]
[A][B][C][LOTS OF STUFF][a][Q][R][D]
大量内容
表示由协同程序处理创建的任意数量的堆栈数据。没有办法知道会有多少

a
b
c
是在Lua中传递给
yield
的值。你可以尽情地玩它们。您甚至可以通过绝对堆栈索引1、2和3回过头来戳
A
B
C

你不能做的是改变很多东西。该数据表示生成的协同路由的状态。不允许你修改它。完全您可能也无法删除它下面的任何元素。因此,您甚至不能删除
A
B
C

规则#2:你必须准确地在哪里继续
[A][B][C][LOTS OF STUFF][a][Q][R][D]
[A][B][C][LOTS OF STUFF]