Lua操作,在mutitheaded环境中工作

时间:2012-10-09 15:09:53

标签: multithreading lua

我的应用程序在多线程环境中使用 Lua 全局互斥。它实现如下:

  1. 线程锁mutex,
  2. 致电lua_newthread
  3. coroutine
  4. 上执行一些初始化
  5. lua_resume
  6. 上运行coroutine
  7. 解锁互斥锁
  8. 当pua与lua_lock/unlock一起使用时,

    coroutine未实现,GC已停止。

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

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

2 个答案:

答案 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