多个脚本和Lua线程的问题

时间:2010-02-04 00:03:07

标签: scripting multithreading lua

当我有两个具有相同功能名称和参数的脚本在不同的线程中运行且支持不同的环境时,第二个线程最终覆盖第一个线程的定义,第一个线程的状态被垃圾收集!

// My thread instancing function
lua_State* LuaInstance::RunInstance(const std::string& fileName)
{
  lua_State* L = lua_newthread(m_state); 

  // Give new thread it's own global table
  lua_newtable(L);
  lua_newtable(L);
  lua_pushliteral(L, "__index");
  lua_pushvalue(L, LUA_GLOBALSINDEX);  // Original globals
  lua_settable(L, -3);
  lua_setmetatable(L, -2);
  lua_replace(L, LUA_GLOBALSINDEX);    // Replace LB's globals

  // Run script off new thread
  luaL_dofile(L, fileName.c_str());

  return L;
}

我基本上试图获得它以便我可以调用这样的多个脚本(对于游戏引擎):

-- Script 1
function Init(self)
  -- Do some stuff
end


-- Script 2
function Init(self)
  -- Do some other stuff
end

1 个答案:

答案 0 :(得分:5)

正如手册中所说,新线程创建的状态与其他线程共享全局状态。如果您需要每线程存储,则必须创建一个在注册表中使用的特殊密钥。

从手册(强调我的):

  

lua_State *lua_newthread (lua_State *L);

     

创建一个新线程,将其推送到堆栈上,并返回一个指针   表示此新线程的lua_State。 返回的新状态   此函数与原始状态共享所有全局对象(例如   如表),但有一个独立的执行堆栈。没有   用于关闭或销毁线程的显式函数。主题是主题   垃圾收集,就像任何Lua对象一样。