Lua: 避免过度使用 pcall 和 Lua 调用栈。

我有一个程序,使用 lua_pcall 快速调用 Lua 脚本。如果程序调用 Lua 脚本太快,就会出现问题,并在最随意的位置导致访问冲突。

我尝试过使用互斥锁甚至启用了 try/catch 的 SEH 异常,但都没有效果。错误函数已经就绪,我正在检查所有适当的返回代码;问题是实际的访问违规深入了 pcall,而不是安全处理的 Lua 错误。

很多时候,这个问题发生在 luaV_execute 中,但有时它也会发生在其他随机位置上。我已经检查过确保所有推送到栈中的参数都是有效的。

有没有一种方法可以强制 Lua 在返回前完成调用,或者确保调用堆栈不会被破坏?

点赞
用户1450890
用户1450890

虽然整个 Lua 系统支持完全可重入,但单个 lua_State 实例本身并不是线程安全的。

如果你从多个线程访问一个 lua_State,你应当使用一个互斥锁或者其他锁机制来确保只有一个线程在任何时候操作该状态。同时访问可能很容易导致你看到的数据破坏。

如果你正在处理多个 lua_State 实例,每个实例都可以有自己的访问锁;你不需要针对整个 Lua 运行时使用单一全局锁。

2012-11-28 14:14:37