我的应用程序在多线程环境中使用 Lua 全局互斥。它实现如下:
lua_newthread
coroutine
lua_resume
coroutine
lua_lock/unlock
一起使用时, coroutine
未实现,GC已停止。
我的问题是,如果初始化过程不需要任何全局Lua结构,我可以执行步骤2和3而不锁定吗?如果coroutine
不需要全局变量,我可以完全执行所有这些过程吗?
在什么情况下我通常可以使用Lua函数而不锁定?
答案 0 :(得分:1)
在什么情况下我通常可以使用Lua函数而不锁定?
在相同的Lua状态(或从相同的源Lua状态派生的线程)?
<强> 无。 强>
Lua是线程安全的,因为可以并行执行单独的Lua状态实例。当您从同一个Lua状态实例上的两个不同线程调用任何 Lua API函数时,绝对没有线程安全保证。
您无法在某些同步机制之外执行任何步骤2,3或4,以防止并发访问同一状态。它只是创建一个新线程(分配内存)或一些“初始化过程”(可能会分配内存)并不重要。即使不分配内存的东西仍然是不允许的。
Lua不保证Lua状态下的线程安全。
答案 1 :(得分:1)
如果您尝试在没有lua_lock/unlock
的单独操作系统线程中尝试使用单 Lua状态,Lua不保证线程安全。如果要使用多线程环境,则需要为每个OS线程使用单独的状态。
查看一些多线程解决方案,例如https://github.com/effil/effil。