我在使用C ++和多个Lua绑定的多进程环境中工作,使用Lua函数来管理进程的某些方面,其中包含一个共享的Lua上下文。
我使用的一般形式是挂钩某些事件,触发Lua函数,然后转换为C ++代码。
我在堆栈上推送两个与进程相关的参数,然后发出
lua_call(L, 2, 0);
问题是某些特定的lua_call
达到了kill函数(预期的行为),但由于lua_call
没有返回,所以堆栈不会被释放。在大约200个这样的调用之后,由于C堆栈溢出,Lua发生了恐慌。
我已经在每个钩子上打印了Lua堆栈,我可以看到它在增长。我尝试使用lua_pop(L, 2)
(堆栈每次增长2),lua_settop(L, 0)
之后Lua使用参数并发出回调,就在杀死进程之前,但无济于事。
我无法调用lua_close(L)
,因为这会破坏进程间共享的上下文,并导致其他进程访问NULL上下文。
答案 0 :(得分:0)
我的解决方法是直接杀死发出lua_call
的进程,而是设置一个标志并在调用返回后终止它,确保没有剩余的堆栈帧。
再次感谢Chris Beck对Lua堆栈如何工作的深刻见解。