在多线程中使用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)
- 1.
- 2.
- 3.
- 4.
- 5.
我们借助以上五个函数,再加上线程同步。基本上能解决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)
- 1.
- 2.
- 3.
- 4.
- 5.
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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
小结:详解在多线程中使用Lua方法的内容介绍完了,希望通过本文的学习能对你有所帮助!