2017-03-01 81 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

相关问题