Lua库函数在多线程环境中发生错误解决方法
2012-05-07 16:03
232 查看
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个)。随后由于自己对多线程的敏感性,我发现了原因。拿出来自己以前的实验代码做了对比,发现单线程的不管调用多少次都没有问题,而多线程的调用了几次就会崩溃,这让我想到是不是同步、互斥、共享的问题没有处理好?我发现自己的lua_State m_L是在两个线程中共享的,于是我稍微编写代码,写成了两个m_L,避免了变量共享的问题,好啦,这些毛病不复现了。解决了一个问题,仿佛是释放了一个包袱,同时也宣誓我的这个技术方案是可行的,能不高兴嘛。
以后要记住了!Lua库函数中的lua_State对象不能在多线程环境中共享!
这几天想要通过Lua来定制角色的行为,但是几次均失败了。说是失败,其实就是程序在运行时,有时候会出错,有时候则不会出错,而且每次出错的地方都不一样。这可难倒了我。究竟是怎么一回事呢?我想自己的游戏使用了多线程。其实游戏中使用多线程是一件非常纠结的事情,因为如果使用了多线程,那么意味着你就必须控制好同步、互斥的问题。而如果不使用多线程则不能好好地利用系统资源。最终我还是使用了多线程技术。当多线程遇上了Lua库,就出毛病了。Lua库有时工作得挺好,有时就会“罢工”,这真是气死我了。我调试了半天也没有什么结果出来,不过最后还是通过自己的实验解决了问题!
首先我想是不是多次调用Lua函数导致虚拟栈溢出了呢?我发现自己调用
lua_getglobal()
lua_pushnumber()
lua_pushnumber()
lua_pcall()
x = luaL_checknumber()
y = luaL_checknumber()
lua_pop(L, 2)
这些函数,理论上应该不会出现栈溢出的现象(push两个,pop2个)。随后由于自己对多线程的敏感性,我发现了原因。拿出来自己以前的实验代码做了对比,发现单线程的不管调用多少次都没有问题,而多线程的调用了几次就会崩溃,这让我想到是不是同步、互斥、共享的问题没有处理好?我发现自己的lua_State m_L是在两个线程中共享的,于是我稍微编写代码,写成了两个m_L,避免了变量共享的问题,好啦,这些毛病不复现了。解决了一个问题,仿佛是释放了一个包袱,同时也宣誓我的这个技术方案是可行的,能不高兴嘛。
以后要记住了!Lua库函数中的lua_State对象不能在多线程环境中共享!
相关文章推荐
- 关于serv-u公网访问出现“打开ftp服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹。详细信息:操作超时”的解决方法
- return 语句在函数之外 错误解决方法
- Linux PC和ARM版的QT环境设置及到ARM移植&常见错误解决方法
- Delphi 多线程 “尚未调用CoInitialize错误”的解决方法
- window.showModalDialog();会弹出当前页面脚本发生错误部分解决方法
- Beyond Compare应用程序发生错误的解决方法
- Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法
- 关于在VS2005中,打开画面设计界面发生非预期错误的解决方法
- Ubuntu设置环境变量错误导致系统无法登录解决方法
- linux上的php环境默认不支持bcdiv函数解决方法
- mysql 发生系统错误1067的解决方法
- Windows7下安装Oracle 10g提示“程序异常终止,发生未知错误”的解决方法
- “LIB 环境变量”中指定的搜索路径"%LIB%"无效 "错误的解决方法
- Ubuntu设置环境变量错误导致系统无法登录解决方法
- Linux环境下MySQL报Table 'xxx' doesn't exist错误解决方法
- Windows7旗舰版下安装Oracle 10g提示“程序异常终止,发生未知错误”的解决方法
- ubuntu 14.04为/检查磁盘时发生严重错误的解决方法
- mysql发生系统错误1067的解决方法
- 发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息"----解决方法
- Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法