lua_newstate与lua_newthread的区别

我正在尝试将Lua实现到我的现有多线程应用程序中。我听说Lua不是线程安全的,所以我为不同的线程创建了不同的lua_State

浏览Lua头文件时,我发现了lua_newthread。你会如何将其实现到已经线程化的应用程序中?你会创建一个lua_State并创建独立的lua_newthread,还是会带来其他问题?

点赞
用户107090
用户107090

lua_newstate 创建一个新的 Lua 状态。不同的状态是完全独立的。

lua_newthread 创建一个新的 Lua 线程并附加到给定的 Lua 状态。一个 Lua 状态可以在 Lua VM 内部有多个执行线程,但它们不是并发执行的;它们是 协程 并且可以共享数据。

不要将 Lua 线程与操作系统线程混淆。

2014-10-26 20:05:04
用户2002452
用户2002452

注意,Lua 线程 并不是 操作系统线程(尽管它的名称可能会误导人),它只是 Lua 自身提供的一种在异步方式下执行代码的设施(而不是在主机应用程序中)。

因此,答案是:在您的应用程序中为每个线程创建一个 lua_State,如果您需要在状态之间传递数据,则使用一个序列化库作为中间件。

2014-10-26 20:06:01
用户15799996
用户15799996

如果你想要一个跨并行线程共享数据的例子,那么我最近做了一些东西:https://gitlab.com/awsdert/gasp

基本前提是主线程(以“int main(...)”开头的线程)处理通信和内存分配,lua 保持一个 C 线程,并在初始化期间传递必要的指针,使其无意识地将其分配通信到其他线程。 如果这些线程存储了初始指针,那么它们就有了一种识别何时更改指向的方法。当要进行分配时,所有线程都被告知等待,然后一旦完成,它们就被告知继续,此时它们将得到新指针,这意味着它们可以在继续之前更新当前指针。由于设计的原因,线程还可以通过仅抓取拥有指针控制权的线程的指针并将消息发送给主线程来通信何时希望读取/写入某些内容,然后主线程通信到所有线程,不知道指针的线程可以报告它们可以继续进行自己的工作,知道它的线程将报告他们可以继续等待消息发送。

2021-04-30 09:35:44