詳解在多線程中使用Lua方法
在多線程中使用Lua方法是本文要介紹的內(nèi)容,大家知道,直到現(xiàn)在的lua 5.1,Lua中的函數(shù)都沒有提供線程安全實現(xiàn)。所以如果在多線程中訪問lua_State 會產(chǎn)生無法預料的結(jié)果。但是現(xiàn)在的應(yīng)用軟件一般都要求采用多線程,來滿足應(yīng)用是的一些要求。
如果不能在多線程中使用Lua ,這將是Lua一個很大的限制。但是有什么辦法解決這個問題呢?所幸的是lua 提供了多線程支持函數(shù),可以用來解決多線程的問題。這五個函數(shù)原型分別如下:
- 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)
我們借助以上五個函數(shù),再加上線程同步。基本上能解決Lua在多線程中的應(yīng)用問題。以上五個函數(shù)的具體用法請參考lua開發(fā)指南。在一下例出相應(yīng)代碼,以供大家參考。
1、多線程使用時發(fā)生Lua棧出錯問題,
產(chǎn)生問題的原因:多線程使用同一個lua_State 會導致lua 棧發(fā)生錯亂,引起各種錯誤。
解決方法:可以采用lua_newthread 函數(shù)來生成一份新的棧,防止棧訪問沖突。
解決方法代碼示例如下(在實際使用中需要更小心的維護lua棧訪問沖突,調(diào)用lua_newthread 時也需要同步機制來保護,需要實現(xiàn)lua_lock、lua_unlock ,以確保多線程訪問時不會沖突。 ):
- lua_State* L = lua_newthread(luaMain)
- ...
- lua_pushstring(L, str);
- ...
- lua_resume(L, n)
2、使Lua 腳本暫停執(zhí)行,但又防止宿主程序主線程被卡住問題。
解決辦法:可以在宿主程序中調(diào)用lua_yield函數(shù)來暫停腳本執(zhí)行,待宿主程序執(zhí)行任務(wù)完成的調(diào)用lua_resume 來恢復lua腳本的繼續(xù)執(zhí)行。
示例代碼如下:
- C++:
- int show_dialog(void)
- {
- ....
- lua_pushnumber(L, IDOK);
- return lua_yield(L, n); \\lua_yield函數(shù)必須放在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
小結(jié):詳解在多線程中使用Lua方法的內(nèi)容介紹完了,希望通過本文的學習能對你有所幫助!