我有一个包含4个线程的程序。
在每个帖子中,我做一个luaL_newstate();
每个线程只能访问它自己的lua实例。
有什么我需要担心的吗? [即是否有一些隐藏状态,所有lua实例在我背后分享?]
谢谢!
答案 0 :(得分:20)
不,这应该可以正常工作。所有解释器状态都是自包含在每个Lua实例中。我甚至会说这是使用Lua和多个线程和/或进程的首选方法。
如果您发现最终需要在Lua状态之间进行通信,那么最好将数据序列化并使用C API传递。我建议您阅读“Exploring Lua for Concurrent Programming”白皮书。它介绍了一种使用多个Lua processes 和 message passing 的方法,用于 inter-process communication 。
答案 1 :(得分:6)
为每个线程创建一个lua_State
是一个很好的解决方案,可以让Lua执行多个线程。但是,这些状态非常分开。特别是,很难在它们之间进行安全通信,因为Lua API只是线程安全的,只要每次从一个线程访问每个lua_State
。 (好吧,除非lua_lock
和lua_unlock
被实现为合适的互斥锁,否则它们不在lua核心的默认构建中。)
如果这种隔离级别不可接受,那么您需要调查其中一种机制,以允许Lua实例在线程化进程中与其他实例很好地协作。
我最喜欢的选择是Lua Lanes,它提供了多个线程以及一种机制,用于以线程安全的方式传递消息并在它们之间共享值。大多数Lua类型的值(包括来自使用它的库的一点C侧支持的userdata
)可以安全有效地从一个通道传递到另一个通道。
存在其他机制,其中大多数机制的良好起点是Lua用户的wiki page on MultiTaksing。
答案 2 :(得分:3)
只要您不尝试在Lua实例之间传递值而不首先将它们转换为C,您就会很好。例如,在实例之间共享可变表几乎是不可能的。
你问的问题听起来很容易,但不一定比简单地运行多个进程更有用,每个进程都有自己的Lua和自己的地址空间。