说,我有一个lua表t={"a"={}, "b"={}}
。
我的问题是,我有两个线程,线程A,线程B.
如果我通过lua_newthread为这两个线程单独创建两个lua_State,而线程A只读/写t.a
,则线程B只读/写t.b
。
我应该在上面的每个帖子中使用lua_lock吗?
如果答案为是,那么,t
上的任何操作都需要lua_lock吗?
答案 0 :(得分:0)
lua表不是线程安全的,但是没有必要锁定,因为线程不能在同一元素上读/写。
答案 1 :(得分:0)
TL; DR:Lua引擎状态不是线程安全的,所以没有理由让Lua表成为线程安全的。
lua_State
不是引擎状态,但引用它。相反,它是Lua线程的状态,与应用程序线程无关。具有相同引擎状态的Lua线程无法并发执行,因为Lua引擎本质上是单线程的(虽然您可以同时使用任意数量的引擎),而是协作多任务。
所以lua_State *lua_newthread (lua_State *L);
创建一个新的Lua线程,而不是OS线程。
lua_lock
之类的内容并未引用线程安全性,但本机代码可以在实现的第2版中通过对引擎的调用来保持Lua对象的方式:https://www.lua.org/manual/2.1/subsection3_5_6.html >
现代方式是使用注册表,一个可从本机代码访问的Lua表:http://www.lua.org/manual/5.3/manual.html#4.5
答案 2 :(得分:0)
不,lua表不是线程安全的。
是的,表t
上的所有操作都需要lua_lock
,因为它们都不是原子操作。