从另一个线程调用Lua函数

时间:2009-12-15 11:18:47

标签: multithreading lua signals

在我的示例应用程序中,我基本上有两个线程。

主线程包含Lua引擎(不是线程安全的)并将一些C ++函数注册到此引擎中。但是,其中一个函数执行时间太长(因为它通过互联网下载了一些文件),我希望Lua引擎在下载过程中继续做其他事情而不会阻塞。

因此,我想让它异步:当从Lua调用downloadFile()函数时,我创建了一个执行下载的新线程。然后,函数返回,Lua引擎可以处理其他工作。下载完成后,第二个线程需要告诉主线程它应该以某种方式调用一些额外的函数processFile()来完成它。

这就是我现在正在努力的目标:实现这一目标的最简单/最简洁的解决方案是什么?

4 个答案:

答案 0 :(得分:3)

例如尝试LuaLanes。还here

答案 1 :(得分:2)

您的downloadFile()或类似命名的函数可以返回一个新的用户数据对象,用于启动线程。这个新的用户数据对象将包含线程句柄,并且具有一个带有__index条目的关联元表,该条目具有检查下载完成状态的功能,并包含其他同步功能。

可能看起来像这样:

local a = downloadFile("foo")

-- do other things

a:join() -- now let the download finish

processFile()

或者这个:

local a = downloadFile("foo")

local busywork = coroutine.create(doOtherStuff)

while(not a:finished()) do
  coroutine.resume(busywork)
end

processFile()

答案 2 :(得分:1)

如果没有将多线程集成到lua中(这不是那么难,Lua已经为它做好了准备),你唯一的解决方案是用c ++处理信令。

根据你的说法,在线程downloadFile()创建的线程中没有与Lua的任何交互,Lua是否必须调用processFile()?如果没有,是什么阻止你在c ++中处理它?如果你需要通知Lua,你可以随时使用回调函数(将其保存在注册表中),用c ++处理信号并运行回调。

由于您的引擎不是线程安全的,我认为在Lua中没有办法处理它。

答案 3 :(得分:0)

downloadFile函数返回"future" object。这可用于检查长时间运行的异步操作的结果。有关示例实现,请参阅java.util.concurrent.FutureQFuture。另外,请查看此mailing list thread,了解使用coroutines在Lua中实施期货/承诺的讨论。