我有一个程序,它使用 lua_pcall
对 Lua 脚本执行非常快的调用。看来如果程序调用 lua 脚本的速度太快,事情就会变得困惑,并在最随机的地方导致访问冲突。
我尝试过互斥体,甚至使用 try/catch 启用 SEH 异常,但无济于事。错误函数已到位,我正在检查所有适当的返回代码;问题是 pcall 深处的实际访问冲突,而不是安全处理的 Lua 错误。
很多时候中断发生在luaV_execute
中,但有时它发生在其他随机位置。我已检查以确保推送到堆栈的所有参数均有效。
有没有办法强制 Lua 在返回之前完成调用,或者有办法确保调用堆栈不会损坏?
最佳答案
尽管 Lua 系统作为一个整体是完全可重入的,但各个 lua_State
实例本身并不是线程安全的。
如果您从多个线程访问 lua_State
,则应使用互斥体或其他锁定机制来确保一次只有一个线程可以操纵该状态。同时访问很容易导致您所看到的那种损坏。
如果您正在使用多个 lua_State
实例,每个状态都可以有自己的访问锁;您不需要为整个 Lua 运行时使用单个全局锁。
关于c++ - Lua:避免 pcall 和 Lua 调用堆栈重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13606066/