3

我的应用程序在具有全局 mutex的多线程环境中使用Lua。它是这样实现的:

  1. 线程锁互斥锁,
  2. 称呼lua_newthread
  3. 执行一些初始化coroutine
  4. lua_resume继续运行coroutine
  5. 解锁互斥锁

lua_lock/unlock没有实现,GC 停止,当 lua 使用coroutine.

我的问题是,如果初始化过程不需要任何全局 Lua 结构,我可以在不锁定的情况下执行第 2 步和第 3 步吗?coroutine如果不需要全局变量,我可以在不锁定的情况下执行所有这些过程吗?

在什么情况下我通常可以使用 Lua 函数而不加锁?

4

2 回答 2

1

在什么情况下我通常可以使用 Lua 函数而不加锁?

在同一个 Lua 状态(或从同一个源 Lua 状态派生的线程)?

没有任何。

Lua 是线程安全的,因为独立的 Lua 状态实例可以并行执行。当您从同一个 Lua 状态实例上的两个不同线程调用任何Lua API 函数时,绝对没有线程安全保证。

您不能在某些同步机制之外执行任何步骤 2、3 或 4,以防止对同一状态的并发访问。不管它只是创建一个新线程(分配内存)还是一些“初始化过程”(可能会分配内存)。即使是不分配内存的事情仍然是不允许的。

Lua 不保证 Lua 状态中的线程安全。

于 2012-10-09T17:28:09.343 回答
1

如果尝试在没有. 如果要使用多线程环境,则需要为每个 OS 线程使用单独的状态。lua_lock/unlock

查看一些多线程解决方案,例如https://github.com/effil/effil

于 2017-10-11T13:59:47.457 回答