在多线程中使用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脚本的继续执行。
示例代码如下:
- C++:
- int show_dialog(void)
- {
- ....
- lua_pushnumber(L, IDOK);
- return lua_yield(L, n); \\lua_yield函数必须放在return 语句后面。
- }
- int end_dialog(void)
- {
- ...
- int ret = lua_resume(L, 0);
- if(ret == LUA_YIELD)
- {
- int id = lua_tonumber(L, -1);
- }
- return 2;
- }
- Lua:
- ret = show_dialog()
- if ret == 0 then
- end
小结:详解在多线程中使用Lua方法的内容介绍完了,希望通过本文的学习能对你有所帮助!