详解在多线程中使用Lua方法

多线程中使用Lua方法是本文要介绍的内容,大家知道,直到现在的lua 5.1,Lua中的函数都没有提供线程安全实现。所以如果在多线程中访问lua_State 会产生无法预料的结果。但是现在的应用软件一般都要求采用多线程,来满足应用是的一些要求。

如果不能在多线程中使用Lua ,这将是Lua一个很大的限制。但是有什么办法解决这个问题呢?所幸的是lua 提供了多线程支持函数,可以用来解决多线程的问题。这五个函数原型分别如下:

int lua_newthred(lua_State* L)  


int lua_resume(lua_State* L, int nargs)  


int lua_yield(lua_State* L int nresults)  


void lua_lock(lua_State* L)  


void lua_unlock(lua_State* L) 

我们借助以上五个函数,再加上线程同步。基本上能解决Lua在多线程中的应用问题。以上五个函数的具体用法请参考lua开发指南。在一下例出相应代码,以供大家参考。

1、多线程使用时发生Lua栈出错问题,

产生问题的原因:多线程使用同一个lua_State 会导致lua 栈发生错乱,引起各种错误。

解决方法:可以采用lua_newthread 函数来生成一份新的栈,防止栈访问冲突。

解决方法代码示例如下(在实际使用中需要更小心的维护lua栈访问冲突,调用lua_newthread 时也需要同步机制来保护,需要实现lua_lock、lua_unlock ,以确保多线程访问时不会冲突。 ):

 lua_State* L = lua_newthread(luaMain)  


  ...  


 lua_pushstring(L, str);  


...  


lua_resume(L, n) 

2、使Lua 脚本暂停执行,但又防止宿主程序主线程被卡住问题。

解决办法:可以在宿主程序中调用lua_yield函数来暂停脚本执行,待宿主程序执行任务完成的调用lua_resume 来恢复lua脚本的继续执行。

示例代码如下:

相关推荐