Lua调试挂钩似乎阻止协程工作

时间:2019-02-25 01:47:46

标签: lua coroutine

因此,我正在尝试在lua中构建一个多任务系统,该系统以固定间隔将控制权交还给主线程。 问题是,debug.sethook似乎在将协程设置为调用coroutine.yield时立即导致协程死亡。

设置为执行其他操作似乎正常。

o=coroutine.create(function()
   print("Hello")
   print("goodbye")
end)
debug.sethook(o,coroutine.yield,"l",1)
coroutine.resume(o)--No output here
print(coroutine.status(o))--prints dead.

我在做什么错了?

编辑:它也几乎在最小的上下文中发生,所以我简化了示例代码。

3 个答案:

答案 0 :(得分:1)

如果打印resume调用的结果,则会看到类似false attempt to yield across a C-call boundary的内容,因此执行失败,因为您尝试从调试钩子中yield做不到(您需要从调试挂钩中返回)。您可以将resume从调试钩子插入不同的协程,并从那里进行屈服,但不能从钩子屈服。

如果您解释要进行的操作(在编辑中),也许可以建议使用其他解决方案。

答案 1 :(得分:1)

在用debug.sethook(co, function() return true end, "y")设置的钩子中返回true时将产生的库

该库足以创建多任务lua系统 只需在代码的第一部分运行require("yieldhook") git上的更多信息

https://github.com/evg-zhabotinsky/yieldhook

答案 2 :(得分:0)

由于这种方法似乎是错误的选择,所以最终我要做的是我发现this article on lua signal handling和在该email thread上发现的东西。

基本上,我必须设置一个posix计时器,以便在我希望它潜在地中断执行以切换到另一个协程时向其进程发送信号,设置一个挂钩以在相关线程状态上调用lua_yield。

这使我可以模拟一些我一直在寻找的多处理功能,并且碰巧相当快,这非常好。