2011-12-03 74 views
1

我正在LUA的線程中工作,我正在使用lua_newthread在我的代碼中執行相同的函數n次。lua_newthread正在停止

要與競爭對手的線程一起實例化C++中的一些線程,併爲每個線程分配一個lua_state這個lua_state = lua_newthread。 此線程僅在應用程序結束時被銷燬,所以我總是重用這些線程的屬性lua_state。我的問題是這樣的, 經過一段運行時間,應用程序發生崩潰,這可能是垃圾收集器造成的?

在我上一次的應用程序中,我使用了命令lua_gc(thread,LUA_GCSTOP,0),但錯誤仍然存​​在。

我試過的另一個策略是lua_resume每次運行結束時,我添加了命令lua_settop(thread,0),以便電池耗盡並且不消耗任何內存空間。

請幫幫我,會發生什麼?

回答

4

Lua線程是而不是像CPU線程一樣。 Lua不是線程安全的;你的不能跨實際線程並行執行Lua代碼。 Lua允許合作多任務,但不是真正的CPU線程。

您可以調用來自不同CPU線程的不同實際的lua_State對象,但前提是它們確實是分開的。如果您從根lua_State創建了Lua線程,那麼您無法在該Lua線程上調用Lua代碼,同時也調用根lua_State上的Lua代碼。如果兩個Lua線程共享相同的父代lua_State,則不能同時在這兩個Lua線程上執行Lua代碼。

所以你需要重新調整你正在做的事情。代替使用線程,請使用lua_newstate爲每個CPU線程創建一個Lua狀態。每個lua_State將完全獨立於其餘。

+0

謝謝! 使用策略lua_State完全獨立,是否有任何方法可以完成全局變量的共享? 我需要訪問全局變量。在這種情況下,我使用LOCK和UNLOCK方法來訪問這些變量。 –