2017-03-01 76 views
1

有關在Lua中通過C++遊戲引擎進行線程處理的簡短問題...創建Lua線程的有效方法?

我想知道創建Lua線程的效率。它看起來並不像我們想要做的那樣,因爲似乎每次創建線程都有一個Lua塊的大副本。所以 -

lua_State *L = luaL_newstate(); 
luaL_openlibs(L); 

lua_State *thread = lua_newthread(L); 
luaL_loadfile(thread, "luac1.bin"); // or luaL_loadbuffer or ? 
lua_resume(thread, NULL, 0); 

新的線程總是涉及到塊數據的複製,並且當線程結束時塊丟失,我相信。有沒有一種有效的方法能夠反覆產生這些線程而不會每次都有任何塊拷貝?

我應該補充說,這些是線程,因爲它們可能會在結束之前產生收益。

感謝

+0

我覺得很奇怪,你在標題中正確地說出「Lua」,但隨後繼續屠宰它並在帖子中說「LUA」。 – warspyking

+0

該「線程」的目的是什麼? Lua線程並不是並行工作,而是用於協程。如果你需要長時間運行並且經常收益的東西,那麼Lua線程就可以。如果你只需要在某個事件上執行腳本,那麼你不需要Lua線程。 – Vlad

+0

@Vlad是的,這些線程會經常產生。但是說我有很多遊戲對象進入和退出。我希望每個人都能運行一個令人滿意的Lua線程,但是我不想在每次產生一個新線程時都複製這些塊數據... – tonyw

回答

1

你要尋找的是lua_xmove:「相同的狀態的不同線程之間的交換價值。」

lua_State* L = luaL_newstate(); 
luaL_openlibs(L); 

lua_State* thread1 = lua_newthread(L); 
lua_State* thread2 = lua_newthread(L); 

// load chunk as a function and copy it to the top of each thread's stack 
luaL_loadfile(L, "luac1.bin"); 
lua_pushvalue(L, -1); 
lua_xmove(L, thread1, 1); 
lua_pushvalue(L, -1); 
lua_xmove(L, thread2, 1); 

lua_resume(thread1, NULL, 0); 
lua_resume(thread2, NULL, 0); 

這樣你只需要加載一次塊。線程都共享相同的實例。

+0

謝謝 - 有用的信息! – tonyw

相關問題