Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scripting 多个脚本和Lua线程出现问题_Scripting_Multithreading_Lua - Fatal编程技术网

Scripting 多个脚本和Lua线程出现问题

Scripting 多个脚本和Lua线程出现问题,scripting,multithreading,lua,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

当我有两个具有相同函数名和参数的脚本在不同的线程中运行时,第二个线程会覆盖第一个线程的定义,第一个线程的状态会被垃圾回收

// 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;
}
我基本上是想得到它,这样我就可以像这样调用多个脚本(对于游戏引擎):


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

从手册(我的重点):

lua_State*lua_新线程(lua_State*L)

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


我的实例化函数没有给线程提供它自己的空全局状态吗;国家是共享的;只有执行堆栈是新的。请参阅编辑。这确实需要一个单独的问题,但您可以尝试返回init函数,例如,
返回函数(self)。。。做些事情。。。结束
。然后可以调用
dofile(“script1.lua”)(self)
。你知道向上投票按钮是怎么工作的吗?
-- Script 1
function Init(self)
  -- Do some stuff
end


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