在我的示例应用程序中,我基本上有两个线程。
主线程包含Lua引擎(不是线程安全的)并将一些C ++函数注册到此引擎中。但是,其中一个函数执行时间太长(因为它通过互联网下载了一些文件),我希望Lua引擎在下载过程中继续做其他事情而不会阻塞。
因此,我想让它异步:当从Lua调用downloadFile()
函数时,我创建了一个执行下载的新线程。然后,函数返回,Lua引擎可以处理其他工作。下载完成后,第二个线程需要告诉主线程它应该以某种方式调用一些额外的函数processFile()
来完成它。
这就是我现在正在努力的目标:实现这一目标的最简单/最简洁的解决方案是什么?
答案 0 :(得分:3)
答案 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.Future或QFuture。另外,请查看此mailing list thread,了解使用coroutines在Lua中实施期货/承诺的讨论。