最近,当我使用C ++和Lua进行开发时遇到了很多困难。我的情况是:出于某种原因,我的C ++程序中可能有数千个Lua状态。但这些状态在初始化之后应该是相同的。当然,我可以为每个状态执行luaL_loadlibs()和lua_loadfile(),但这非常重(事实上,即使只是初始状态,我也需要相当长的时间)。所以,我想知道以下架构:如何保持一个单独的Lua状态(唯一必须初始化的状态),然后克隆其他Lua状态,这可能吗?
答案 0 :(得分:4)
当我开始使用Lua时,和我一样,我曾经写过一个有数千个州的程序,遇到了同样的问题和想法,直到我意识到我做错了:)
Lua有协程和线程,你需要使用这些功能来做你需要的。起初它们可能有点棘手,但你应该能够在几天内理解它们,这将非常值得你花时间。
答案 1 :(得分:1)
不幸的是,没有。
您可以尝试使用Pluto来序列化整个状态。它确实运行良好,但在大多数情况下,它的成本与正常初始化大致相同。
答案 2 :(得分:1)
看看下面的lua API调用,我认为这正是你所需要的。
lua_State *lua_newthread (lua_State *L);
这将创建一个新线程,将其推送到堆栈上,并返回指向代表此新线程的lua_State
的指针。此函数返回的新线程与原始线程共享其全局环境,但具有独立的执行堆栈。
没有显式函数来关闭或销毁线程。与任何Lua对象一样,线程可以进行垃圾收集。
答案 3 :(得分:0)
我认为只要复制状态会有内部引用以及可能指向外部数据的指针,我很难完全按照您的要求进行操作。人们需要重建那些内部引用,以便不仅仅有多个状态指向克隆源。
您可以在启动后序列化状态,然后将其加载到后续状态。如果初始化非常昂贵,那么这可能是值得的。
我认为最接近你想做的事情是相对容易的是通过初始化一个状态然后分叉将状态放在不同的进程中,但是你的操作系统支持它: http://en.wikipedia.org/wiki/Fork_(operating_system)
如果你想从Lua中获得一些东西,你可以试试这样的东西: How do you construct a read-write pipe with lua?