Lua库函数在多线程环境中发生错误解决方法这几天想要通过Lua来定制角色的行为,但是几次均失败了。说是失败,其实就是程序在运行时,有时候会出错,有时候则不会出错,而且每次出错的地方都不一样。这可难倒了我。究竟是怎么一回事呢?我想自己的游戏使用了多线程。其实游戏中使用多线程是一件非常纠结的事情,因为如果使用了多线程,那么意味着你就必须控制好同步、互斥的问题。而如果不使用多线程则不能好好地利用系统资源。最终我还是使用了多线程技术。当多线程遇上了Lua库,就出毛病了。Lua库有时工作得挺好,有时就会“罢工”,这真是气死我了。我调试了半天也没有什么结果出来,不过最后还是通过自己的实验解决了问题!
首先我想是不是多次调用Lua函数导致虚拟栈溢出了呢?我发现自己调用
lua_getglobal()
lua_pushnumber()
lua_pushnumber()
lua_pcall()
x = luaL_checknumber()
y = luaL_checknumber()
lua_pop(L, 2)
这些函数,理论上应该不会出现栈溢出的现象(push两个,pop2个)http://www.pudncom.com/ 。随后由于自己对多线程的敏感性,我发现了原因。拿出来自己以前的实验代码做了对比,发现单线程的不管调用多少次都没有问题,而多线程的调用了几次就会崩溃,这让我想到是不是同步、
ipad games互斥、共享的问题没有处理好?我发现自己的lua_State m_L是在两个线程中共享的,于是我稍微编写代码,写成了两个m_L,避免了变量共享的问题,好啦,这些毛病不复现了。解决了一个问题,仿佛是释放了一个包袱,同时也宣誓我的这个技术方案是可行的,能不高兴嘛。
以后要记住了!Lua库函数中的lua_State对象不能在多线程环境中共享!