首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取lua内部的lua状态

获取lua内部的lua状态
EN

Stack Overflow用户
提问于 2019-09-24 01:14:13
回答 2查看 582关注 0票数 0

我想从lua内部获得lua状态,这样我也可以将它传递给外部程序,而不能使用ffi或dll来连接它。我只需要一个指向它的指针和共享它的能力(跨程序边界共享内存。

或者我可以在我的程序中创建一个lua状态,然后传递它,这样我就只需要在lua中将lua状态设置为它(并且它必须与共享内存一起工作)。

我曾考虑过使用json共享数据,但理想情况下,我希望直接访问对象。

EN

回答 2

Stack Overflow用户

发布于 2019-09-24 02:53:38

Lua在避免堆分配和指向已分配内存的全局指针方面做得很好。lua_newstate takes allocator function as a parameter.提供的函数将用于分配/释放与lua_State对象关联的所有内存。包括由lua_newstate返回的指针。

因此,假设您可以提供一个分配器函数来分配/释放进程间共享内存。然后,您可以将lua_State传递给其他进程并访问它。

首先,你显然不能“从lua内部”做到这一点;这种低级的事情是不会发生的。您不能从Lua中访问lua_State对象。您必须控制lua_State的创建过程,才能实现这一点。因此,我们在这里讨论的是C(等价)代码,而不是in-Lua代码。

现在,您可以向Lua公开一个C函数,该函数返回一个轻量级的userdata,恰好就是所讨论的lua_State*。但Lua除了将其传递给其他C函数API之外,并不能真正对轻量级用户数据做太多事情。

其次,虽然Lua系统提供了只通过分配器分配内存的保证,但系统并不保证您正在尝试做的事情能够正常工作。Lua实现确实使用了进程全局内存,这是完全有可能的,只要它这样做,即不同的线程可以在不破坏线程保证的情况下访问全局内存。

显然,您可以检查Lua实现,看看它是否做了类似的事情。但我的观点是,保证每个独立的lua_State彼此之间是线程隔离的,并且每个lua_State只通过给定的分配器分配内存。不能保证Lua的实现没有用于某些目的的全局存储。

因此,简单地共享Lua状态分配的内存可能是不够的。

而且,即使这样工作,两个进程也不能同时访问相同的lua_State对象,就像同一进程中的两个线程不能同时访问lua_State一样。

票数 1
EN

Stack Overflow用户

发布于 2019-09-24 01:22:40

lua状态并不是为了离开它正在执行的程序/线程而设计的。

在正在运行的lua_state上执行查询可能会导致崩溃,因为只有当lua调用返回或调用call函数时,它才是名义上一致的。在执行过程中,一些未锁定的修改可能会导致未初始化的内存访问,或由于列表不一致而导致内嵌循环。

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

https://stackoverflow.com/questions/58067231

复制
相关文章

相似问题

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