高效创建Lua线程的方式?

一个关于通过C++游戏引擎在Lua中进行线程操作的问题...

我想知道创建Lua线程的效率如何。看起来这不是我们想经常做的事情,因为每次创建线程时都会有一个Lua块的大复制。所以 -

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

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

新线程总是涉及到数据块的复制,而当线程结束时,数据块似乎就会丢失。有没有一种高效的方法来反复生成这些线程,而不需要每次都进行复制呢?

[编辑] 我应该补充说这些是线程,因为它们可能在结束前想要进行Yield。

谢谢

点赞
用户1288130
用户1288130

你需要的是 lua_xmove:“在相同状态的不同线程之间交换值。”

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

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

// 加载代码块作为函数并将其复制到每个线程的堆栈顶部
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);

这样,您只需要加载一次代码块即可。线程都共享相同的实例。

2017-03-01 14:36:44