![]() |
1
7
我不知道该怎么做,尽管没有正式的Lua语义(就像
如果我想要Lua的先发制人的多任务处理,我甚至不会尝试在纯Lua中进行。相反,我使用的是20年前在新泽西标准ML中第一次看到的一个老技巧:
这个补丁易于编写和维护。它并不能解决长时间运行的C函数不能先发制人的问题,但是如果你必须解决这个问题,你将进入一个更困难的领域,你也可以在C级别完成所有线程,而不是在Lua级别。 |
![]() |
2
5
不是我所知道的,不是。如果您可以使用debug.sethook从coroutines上设置的钩子中让步,这几乎是荒谬的简单,但是它不起作用。你 可以 从C(Lua_sethook)设置的C钩子获得收益,但我不知道 确切地 要做到这一点,无论如何也不是纯粹的Lua。 即使可能,也不会是真正的线程。例如,所有操作系统都将在同一个操作系统线程中运行。你的钩子会考虑各种因素(比如时间,也许记忆等),然后决定是否屈服。屈从于共同行动的人会决定下一个行动的是哪个孩子。您还需要决定何时调用钩子。最常见的是每个lua指令,但这会带来性能损失。如果协程调用了C函数,Lua就没有管辖权。如果这个电话要花很长时间,你就无能为力了。 Here 这是Lua-L邮件列表中的一个相关线程,您可能会发现它很有趣。 |
![]() |
3
5
不,不能用纯Lua编写抢占式调度程序。在某种程度上,抢占式调度程序需要一些机制,比如中断服务例程,来从当前线程获取控制权,并将其交给调度程序,然后调度程序再将其交给另一个线程。纯Lua没有这种机制。 你提到Windows主要是用C/C++编写的。关键字主要是。不能在纯ANSI C/C++中编写抢占式调度程序。通常,中断服务程序的一部分是用汇编语言编写的。或者,C/C++编译器实现非标准扩展,允许中断服务例程用C/C++编写。有些编译器允许您声明带有中断修饰符的函数,该修饰符使编译器生成一个延长/epilog,该修饰符允许函数用作中断服务例程。 此外,设置中断服务程序的代码使用内存映射IO或IO指令的CPU寄存器。这些代码都不是便携式的ANSI C/C++。而且,取决于CPU架构。 |
|
John Whitham · 如何修复“尝试调用字符串值”错误 1 年前 |
![]() |
oreto · Roblox Lua脚本,如何使帧从左到右减小其大小? 2 年前 |
![]() |
Jexter Labo · 如何在Lua中从循环表中删除键值 2 年前 |
![]() |
Zack Lee · 在Lua中查找未使用的符号 6 年前 |
|
User101 · Roblox Studio-GUI的按键切换 6 年前 |
![]() |
Doudou · 当我的noob被杀死时,我的GUI如何显示? 6 年前 |
![]() |
eonmax · Lua在后台执行python脚本 6 年前 |