首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua的Pluto库的线程持久性是什么?

Lua的Pluto库的线程持久性是什么?
EN

Stack Overflow用户
提问于 2012-01-10 09:42:03
回答 2查看 359关注 0票数 0

在Lua的Pluto库的description中,它写着lib持久化函数和线程。

代码语言:javascript
复制
Can persist any Lua function
Can persist threads
Works with any Lua chunkreader/chunkwriter
Support for "invariant" permanent objects, of all datatypes

嗯,我无法想象如何持久化函数和线程。我可以得到一些关于这个功能的解释吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-11 00:57:38

可以持久化任何Lua函数

这意味着Pluto可以通过持久化它的字节码和所有必需的upvalue来持久化任何Lua函数。有关源代码,请参阅herehere。当您取消持久化它时,您可以照常调用该函数。注意,它不能持久化在Lua中注册的C函数。

可以持久化线程

它持久化线程的堆栈和激活记录,因此当您取消持久化它时,您可以继续执行堆栈。代码是here

票数 0
EN

Stack Overflow用户

发布于 2012-01-11 01:09:27

source code相对容易理解,并且很容易被注释。

lib所做的是确定哪些部分组成函数和/或线程,然后分别存储每个部分。

如果您跳过代码,只阅读注释,下面是两个相关函数的外观:

代码语言:javascript
复制
static void persistfunction(PersistInfo *pi)
{
  ...
  if(cl->c.isC) {
  /* It's a C function. For now, we aren't going to allow
   * persistence of C closures, even if the "C proto" is
   * already in the permanents table. */
    lua_pushstring(pi->L, "Attempt to persist a C function");
    lua_error(pi->L);
  } else { /* It's a Lua closure. */
    /* Persist prototype */
    ...
    /* Persist upvalue values (not the upvalue objects themselves) */
    ...
    /* Persist function environment */
    ...
  }
}

static void persistthread(PersistInfo *pi)
{
  ...
  /* Persist the stack */
  ... 
  /* Now, persist the CallInfo stack. */
  ...
  /* Serialize the state's other parameters, with the exception of upval stuff */
  ...
  /* Finally, record upvalues which need to be reopened */
  ...
}

因此,正如您所看到的,一个函数可以被认为是一个原型、一组upvalue和一个环境(表)的组合。一个线程由两个“堆栈”(我认为是调用堆栈和内存堆栈)、状态信息(不包括upvalue)和upvalue组成。

你可以在PiL 27.3.3中阅读更多关于upvalues的内容

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8797598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档