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函数轮询下载状态仍然很简单。