我的一般想法是,单线程应用程序(Lua解释器)将始终恶化依赖于它的多线程应用程序(通用C ++应用程序)的性能。
为了避免这个问题,我正在考虑对解释器采用异步方法,同时保持C ++应用程序的多线程,这基本上意味着基于我的方法,Lua解释器应该以某种方式将整个脚本/文件推送到调度程序中一种异步方法(无需等待结果),这取决于设计良好的C ++多线程消息传递系统,以保持所有顺序。
通常的关系是C/C++ function <-> Lua
(采用顺序方法);我希望有类似C++ messaging system <-> entire Lua script
的内容。
我也对任何可以解决这个问题的方法持开放态度,并真正帮助Lua和专为多线程设计的C ++应用程序之间的混合。
这种方法是否可以通过某种软件实现?
修改
我需要“用户证明”的东西,我需要在C ++ / Lua API设计中实现这种行为。
答案 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的方法:
示例:
local version;
Application.requestVersionNumber(function(val) version = val; end)
当然这个例子是荒谬的,但你明白了。
您应该知道的一件事是,使用回调方法,如果您不小心,脚本会很快得到高度分层。虽然这对于性能并不坏,但它们很难阅读。