c++ - Lua:避免 pcall 和 Lua 调用堆栈重载

标签 c++ lua access-violation callstack stack-corruption

我有一个程序,它使用 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/

相关文章:

c++ - 全局变量计数

lua - 操作表键

c - 插入二叉搜索树访问冲突错误

c# - 为什么 AccessViolationException 不能被 .NET4.0 捕获

c++ - 如何使用 clang 获取单个 cpp 文件的 AST?

c++ - 在 C++ 中声明 vector 和集合

c++ - 将只读数据安全地传递给新线程

string - 从 URL 获取参数,获取查询字符串中的子字符串并将它们存储在表中

c++ - Lua API 推送用户数据

c - 为什么这段修改字符串的代码不起作用?