2

我有一个程序可以使用lua_pcall. 似乎如果程序调用 lua 脚本的速度太快,事情就会出错并在最随机的地方导致访问冲突。

我尝试过互斥锁,甚至使用 try/catch 启用 SEH 异常都无济于事。错误函数已经到位,我正在检查所有适当的返回代码;问题是 pcall 深处的实际访问冲突,而不是安全处理的 Lua 错误。

很多时候中断发生在luaV_execute,但有时它发生在其他随机的地方。我已经检查以确保推送到堆栈的所有参数都是有效的。

有没有办法强制 Lua 在返回之前完成调用,或者有什么方法可以确保调用堆栈不会损坏?

4

1 回答 1

5

尽管 Lua 系统作为一个整体是完全可重入的,但单个lua_State实例本身并不是线程安全的。

如果您lua_State从多个线程访问 a,则应使用互斥锁或其他锁定机制来确保一次只有一个线程可以操纵该状态。同时访问很容易导致您看到的那种损坏。

如果您正在使用多个lua_State实例,则每个状态都可以有自己的访问锁;整个 Lua 运行时不需要一个全局锁。

于 2012-11-28T14:14:37.987 回答