Lua的异步解释器解决多线程方法?

时间:2013-11-19 15:09:14

标签: c++ c multithreading asynchronous lua

我的一般想法是,单线程应用程序(Lua解释器)将始终恶化依赖于它的多线程应用程序(通用C ++应用程序)的性能。

为了避免这个问题,我正在考虑对解释器采用异步方法,同时保持C ++应用程序的多线程,这基本上意味着基于我的方法,Lua解释器应该以某种方式将整个脚本/文件推送到调度程序中一种异步方法(无需等待结果),这取决于设计良好的C ++多线程消息传递系统,以保持所有顺序。

通常的关系是C/C++ function <-> Lua(采用顺序方法);我希望有类似C++ messaging system <-> entire Lua script的内容。

我也对任何可以解决这个问题的方法持开放态度,并真正帮助Lua和专为多线程设计的C ++应用程序之间的混合。

这种方法是否可以通过某种软件实现?

修改

我需要“用户证明”的东西,我需要在C ++ / Lua API设计中实现这种行为。

2 个答案:

答案 0 :(得分:2)

一种选择是实现与lua的通信作为协同例程。消息通过coroutine.yield(messagedata)发送到C ++,然后通过lua_resume发回结果。 (另见:lua_newthread)。您甚至可以将函数包装起来以提供更好的事件UI。

function doThing(thing, other, data)
  return coroutine.yield("doThing", thing, other, data)
end

在任何给定时间你仍然只能有一个线程运行lua解释器(你必须做锁定),但是你可以同时运行多个这样的协同例程。

答案 1 :(得分:1)

Lua中的并发是一个有很多解决方案的主题。这是一个资源:

你实际上可以让自己变得容易,因为你实际上并不需要运行Lua本身的多线程,这会带来许多额外的问题。

显而易见的解决方案是在一个单独的线程中运行Lua,但只为Lua提供一个瘦API,其中每个API调用都会立即分叉新的线程/进程或使用某种消息传递进行异步数据传输,甚至使用短时信号量读/写一些值。这个解决方案需要某种空闲循环或事件监听器,除非你想忙着等待......

我认为使用新API实现的另一个选项仍然很容易,实际上是node.js的方法:

  • 在一个单独的线程中运行Lua
  • 制作完整的API函数,只接受回调。这些回调排队,可以由C ++应用程序安排。
  • 您甚至可以为标准Lua API提供回调包装。

示例:

local version;
Application.requestVersionNumber(function(val) version = val; end)

当然这个例子是荒谬的,但你明白了。

您应该知道的一件事是,使用回调方法,如果您不小心,脚本会很快得到高度分层。虽然这对于性能并不坏,但它们很难阅读。