- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:下面有一些问题可以说明我的想法,但是我要寻找的唯一答案是标题中实际问题的答案。在这里不要求“一本书”,也不要求对所有这些都逐项答复。
我正在尝试从C API启动协程,让其产生,并在以后继续进行(可能是在从其他协程执行履历之后)。这是一个非常简单的用例,但是lua_resume()
的文档非常混乱:
int lua_resume(lua_State * L,lua_State * from,int nargs);
在给定线程L中启动和恢复协程。
要启动协程,请将主函数加到线程堆栈上
任何论点;然后调用lua_resume,其中nargs是
论点。当协程暂停或完成其调用时,此调用返回
执行。返回时,堆栈包含所有传递给的值
lua_yield或body函数返回的所有值。 lua_resume返回
如果协程产生,则为LUA_YIELD;如果协程完成,则为LUA_OK
无错误执行,或在发生错误时显示错误代码(请参见
lua_pcall)。
如果发生错误,则不会解开堆栈,因此您可以使用调试API
超过它。该错误消息在堆栈的顶部。
要恢复协程,请从最后一个lua_yield中删除所有结果,
在其堆栈上,仅将值作为yield的结果传递,然后
呼叫lua_resume。
来自的参数代表协程的L值。
没有这样的协程,此参数可以为NULL。
在这里,“代表代表协程的L的含义”的含义非常不清楚。什么时候“ from”为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个...
最佳答案
当“ from”为nil时,L和from中的哪个为“线程堆栈”。
如果您要询问from
参数的含义,请输入it would appear that there isn't much of one。只有在协程内部调用执行简历的C函数本身时,才可以使用它。L
是已将要恢复的参数(和启动函数,如果它是初始的resume调用)压入的堆栈。这样最适合术语“线程堆栈”。
恢复协程的确切要求是什么?
如the docs for lua_status
中所述,如果线程的状态为LUA_OK
或LUA_YIELD
,则可以恢复线程。
请注意,恢复线程和恢复协程之间有区别。 lua_resume
恢复线程。如果状态为LUA_OK
,则没有活动协程,因此您正在创建新的协程,因此必须提供功能。如果线程是LUA_YIELD
,则恢复线程将恢复产生的协程。
是否可以在初始lua_resume()和第二个实际恢复的状态之间修改状态L?
当然可以;它一定要是。毕竟,您将获得的回报/收益率值推到L
上。当您继续进行恢复时,必须删除这些值并将新值作为将从Lua的yield
函数返回的值压入堆栈。
是的,您可以对其进行修改。但是有关于您可以做什么的规则。他们两个人:
规则#1:你不能戳那些不属于你的东西。
假设Lua堆栈看起来像这样,就在您的初始简历(从左到右)之前:
[A][B][C][F][1][2][3]
F
是您要启动的功能。参数1、2和3。因此,您将3作为
nargs
传递。
A
,
B
和
C
只是您放入该堆栈中的任意内容。
[A][B][C][LOTS OF STUFF][a][b][c]
LOTS OF STUFF
表示由协程的处理创建的任意数量的堆栈数据。没有办法知道那里多少。
a
,
b
和
c
是在Lua中传递给
yield
的值。您可以和他们一起玩,让您心满意足。您甚至可以通过它们的绝对堆栈索引1、2和3来返回并戳
A
,
B
和
C
。
LOTS OF STUFF
。该数据代表产生的协程状态。您无权更改。完全没有您可能也无法删除其下方的任何元素。因此,您甚至无法删除
A
,
B
或
C
。
[A][B][C][LOTS OF STUFF][a][Q][R][D]
a
是原始返回值之一,而其他则是您在此期间创建的临时值。因此,现在该恢复协程了。您需要传递一些新参数1和2。如何做到这一点?
[A][B][C][LOTS OF STUFF]
nargs
设为2来恢复协程。
LOTS OF STUFF
部分告诉它“要恢复的位置/功能”。
lua_resume
由于错误而失败时,它将信息留在堆栈上以跟踪简历和发出错误的位置之间发生的情况。但是它不知道简历本身是如何发生的。这是您必须执行的操作,具体取决于您如何恢复该协程。
from
字段的目的不是将恢复器连接到恢复器。
关于lua - lua_resume():第二个参数的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37644678/
注意:下面有一些问题可以说明我的想法,但是我要寻找的唯一答案是标题中实际问题的答案。在这里不要求“一本书”,也不要求对所有这些都逐项答复。 我正在尝试从C API启动协程,让其产生,并在以后继续进行(
我有一些 lua 脚本有一些长时间运行的任务,比如获取网页,所以我让它 yield 然后 C 代码句柄获取页面作业异步,所以线程可以自由地做其他工作,并在指定时间后返回检查查看获取页面作业是否已完成,
来自 Lua 5.2 Reference Manual : int lua_resume (lua_State *L, lua_State *from, int nargs); [...] The p
我只想恢复 func 协程两次,如果 n==0 则产量,如果 n==1 则返回,但它核心转储,有什么问题吗? “hello world”应该始终保留在 LL 的堆栈中,我不知道出了什么问题。 [lia
我是一名优秀的程序员,十分优秀!