多个线程同时读写同一个 lua vm 的问题 #1827
-
我的框架skynet-calc中 多个线程(skynet service) 会同时调用同一个 lua vm中的一个全局函数, 每个线程调用时用的是不同的Stack (lua_newthread), 现在已知的是 gc 会引起崩溃,禁用后就好了. 注意到云大之前也有过类似的尝试 开发笔记(18) : 读写锁与线程安全。我想知道,除了gc 还有什么操作可能会引起程序崩溃吗 @cloudwu |
Beta Was this translation helpful? Give feedback.
Replies: 5 comments 2 replies
-
lua vm 不能也不应该多线程访问。 |
Beta Was this translation helpful? Give feedback.
-
理论上来说,lua vm 要被多线程访问,可以通过 lua_lock/lua_unlock 宏来实现,但好像没有见过在实际项目中这样用的。可以去 lua mailing list 去搜索一下 lua_lock 或 lua_unlock
|
Beta Was this translation helpful? Give feedback.
-
除了关掉 gc 你还不可以有任何新的内存分配。包括并不限于:创建新的 table 和字符串、栈帧的深度和大小大于过去的最大值、创建闭包。 |
Beta Was this translation helpful? Give feedback.
-
我又有了新的 Idel,受 sharetable 启发,我发现将 table 指针复制到多个lua vm(service) 可以正常读写, 甚至可以可以给该table赋值函数(可以带 upvalue)并在另外一个service 中调用! 不考虑函数调用,我只用这个table存储(多线程读写) 数字/布尔值/字符串/子表, 程序不能崩了吧(我的判断理由 1. root table 可以放在一个独立的 vm 中,并关掉gc。2.内存分配: 所有的写操作就算有 new table, string 的操作也是在本地vm中进行的,3.跨vm调用table下的函数我不是很理解,应该不安全吧) @cloudwu |
Beta Was this translation helpful? Give feedback.
-
不要多线程访问同一个 vm ,我不再讨论这个话题。 |
Beta Was this translation helpful? Give feedback.
lua vm 不能也不应该多线程访问。