Multithreading 从另一个线程调用Lua函数
在我的示例应用程序中,我基本上有两个线程Multithreading 从另一个线程调用Lua函数,multithreading,lua,signals,Multithreading,Lua,Signals,在我的示例应用程序中,我基本上有两个线程 主线程包含一个不安全线程的LuA引擎,并将一些C++函数注册到该引擎中。但是,其中一个函数需要花费很长时间才能执行,因为它通过internet下载一些文件,我希望Lua引擎在下载过程中不阻塞地继续执行其他操作 因此,我想使其异步化:当从Lua调用downloadFile函数时,我创建一个执行下载的新线程。然后,函数返回,Lua引擎可以处理其他工作。下载完成后,第二个线程需要告诉主线程,它应该调用其他函数processFile来完成下载 这是我现在正在挣扎
主线程包含一个不安全线程的LuA引擎,并将一些C++函数注册到该引擎中。但是,其中一个函数需要花费很长时间才能执行,因为它通过internet下载一些文件,我希望Lua引擎在下载过程中不阻塞地继续执行其他操作
因此,我想使其异步化:当从Lua调用downloadFile函数时,我创建一个执行下载的新线程。然后,函数返回,Lua引擎可以处理其他工作。下载完成后,第二个线程需要告诉主线程,它应该调用其他函数processFile来完成下载这是我现在正在挣扎的地方:什么是最容易的/最干净的解决方案?
< P>不将多线程集成到LUA中,这不是那么难,Lua已经准备好了,你唯一的解决方法是处理C++中的信令。p> 根据您所说的,在下载文件创建的线程中没有与Lua的任何交互,Lua必须调用processFile吗?如果不是,什么阻止你在C++中处理所有这些?如果需要通知Lua,您可以始终使用回调函数,将其保存在注册表中,处理C++中的信号并运行回调。因为你的引擎不是线程安全的,我认为Lua没有办法处理它。
< P>没有将多线程集成到LUA中,这并不难,Lua已经准备好了,你唯一的解决办法是处理C++中的信令。p> 根据您所说的,在下载文件创建的线程中没有与Lua的任何交互,Lua必须调用processFile吗?如果不是,什么阻止你在C++中处理所有这些?如果需要通知Lua,您可以始终使用回调函数,将其保存在注册表中,处理C++中的信号并运行回调。因为您的引擎不是线程安全的,所以我认为没有办法在Lua中处理它。例如,尝试一下。另外。例如,试试看。另外。下载文件或类似名称的函数可以返回新的用户数据对象以启动线程。这个新的用户数据对象将包含线程句柄,并有一个关联的元表和一个_索引项,该索引项将有一个检查下载完成状态的功能,并包含其他同步功能 可能是这样的:
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()
新的用户数据对象可以由下载文件或类似命名的函数返回,以启动线程。这个新的用户数据对象将包含线程句柄,并有一个关联的元表和一个_索引项,该索引项将有一个检查下载完成状态的功能,并包含其他同步功能 可能是这样的:
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()
从downloadFile函数返回。这可用于检查长时间运行的异步操作的结果。参见或示例实现。此外,请查看本文,了解有关使用下载文件函数返回a在Lua中实现未来/承诺的讨论。这可用于检查长时间运行的异步操作的结果。参见或示例实现。此外,请查看本文,了解如何使用实现Lua中的未来/承诺。如果您不希望下载完成,只想在下载完成时得到通知,该怎么办?或者,在其他一些环境中:如果您有一些主线程和第二个线程,以一些用户输入为例,您希望在用户输入某个内容时立即中断主线程,该怎么办?您不知道何时必须加入这两个线程,因为您不知道用户何时将输入内容。join只是一个可能的同步调用示例。使用finished type函数轮询下载状态仍然很简单。如果您不希望下载完成,只想在下载完成时收到通知,该怎么办?或者,在其他一些环境中:如果您有一些主线程和第二个线程,以一些用户输入为例,您希望在用户输入某个内容时立即中断主线程,该怎么办?您不知道何时必须加入这两个线程,因为您不知道用户何时将输入内容。join只是一个可能的同步调用示例。使用finished type函数轮询下载状态仍然很简单。