代码之家  ›  专栏  ›  技术社区  ›  anon

在多线程程序中嵌入多个Lua实例

  •  14
  • anon  · 技术社区  · 16 年前

    我有一个4线程的程序。

    在每个线程中,我执行一个lual_newstate();

    每个线程只能访问自己的lua实例。

    我有什么需要担心的吗?[例如,所有Lua实例背后是否都有隐藏状态?]

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  20
  •   Judge Maygarden    16 年前

    不,那就行了。所有解释器状态都独立于每个Lua实例中。我甚至会说这是在多线程和/或进程中使用Lua的首选方法。

    如果您最终发现确实需要在Lua状态之间进行通信,那么最好是序列化数据并使用C API传递它。我建议阅读 Exploring Lua for Concurrent Programming 白皮书。它介绍了一种使用多个Lua的方法 processes 具有 message passing 对于 inter-process communication .

        2
  •  6
  •   RBerteig Keith Adler    16 年前

    创建单个 lua_State 对于有多个执行lua的线程,每个线程是一个很好的解决方案。然而,这些州是 非常 分开的。特别是,在它们之间安全地通信是困难的,因为只要每个lua api都是线程安全的。 卢亚州 一次从单个线程访问。(嗯,除非 lua_lock lua_unlock 是作为一个合适的互斥体实现的,它们不在Lua核心的默认构建中。)

    如果这一级别的隔离不可接受,那么您需要研究几种机制中的一种,以允许Lua实例在线程过程中与其他实例一起工作良好。

    我最喜欢的选择是 Lua Lanes 它为多个线程提供了一种机制,用于以线程安全的方式在消息之间传递和共享值。大多数lua类型的值(包括 userdata 通过使用它的库提供的少量C端支持,可以安全高效地从一条车道传递到另一条车道。

    还存在其他机制,其中大多数机制的一个良好起点是在Lua用户的 wiki page on MultiTaksing .

        3
  •  3
  •   Norman Ramsey    16 年前

    你很好,只要你 不要尝试在Lua实例之间传递值 不需要先将它们转换为C。例如,在实例之间共享可变表几乎是不可能的。

    您所要求的听起来很简单,但并不一定比运行多个进程更有用,每个进程都有自己的lua和自己的地址空间。