【发布时间】:2015-08-06 17:47:04
【问题描述】:
我必须在嵌入式多线程环境中安全地运行 Lua 会话,其中线程堆栈是预先分配的且大小固定。
由于高 C/C++ 堆栈消耗,允许脚本在 Lua 级别失败。
它不允许整个应用程序在 C/C++ 级别崩溃。
我不能依赖 LUAI_MAXCCALLS 和 MAXCCALLS 提供的检查。
检查和防止 Lua 会话的任何潜在堆栈溢出的正确方法是什么?
实施此类检查的正确位置是什么?
【问题讨论】:
-
不幸的是我不能。我有以字节为单位定义的堆栈大小,我无法更改它。并且没有从堆栈大小到 LUAI_MAXCCALLS 和 MAXCCALLS 的直接映射。
-
不幸的是,当我处理 C/C++ 堆栈时,LUA_MINSTACK 控制着 Lua 堆栈。
-
如果你在做一个没有 Lua 的纯 C/C++ 应用程序,你会遇到同样的问题,对吧?您想让其中一个线程在内存消耗的情况下安全崩溃,而其余线程继续。
-
如果是这种情况,那么您需要找到一种方法来检测和处理来自 C/C++ 的堆栈溢出,而不是来自 Lua。让 Lua 在 Lua 中什么都不做就死掉,并使用您选择的 C/C++ 多线程库处理线程错误。
-
嗯,Lua 栈在堆上,所以你只需要关心 C 栈。只有当 Lua 脚本调用 C 函数时,它才会增长。大概有一段常见的代码在 Lua 调用 C 之前总是被调用(源代码的快速 grep 建议在
ldo.c中使用luaD_precall),您可以在其中添加代码来检查 C 堆栈大小并抛出 Lua 错误以中止如果你越来越低,请编写脚本。
标签: multithreading lua