所以,我正在尝试在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.
我究竟做错了什么?
编辑:它也发生在一个接近最小的上下文中,所以我简化了示例代码。
如果你打印resume
调用的结果,你会看到像false attempt to yield across a C-call boundary
这样的东西,所以执行失败,因为你试图从调试钩子yield
,你不能做(你需要从调试钩子返回)。你可以从调试钩子resume
到另一个协程并从那里产生,但你不能从钩子中屈服。
如果你解释一下你想要做什么(在编辑中),也许可以推荐一个不同的解决方案。
我最终做了什么,因为这种方法似乎是错误的,是我发现阅读this article on lua signal handling,以及我在这个email thread上发现的。
本质上我必须设置一个posix定时器,以便在我希望它可能中断执行切换到另一个协程时向我的进程发送信号,设置一个钩子来调用相关线程状态的lua_yield。
这允许我模拟我正在寻找的一些多处理功能,并且碰巧相当快,这非常好。