我正在解决一个大问题,但可能很简单。
我正在QT中开发一个服务器应用程序。该服务器将接受TCP连接,并与特定的专有以太网产品进行对话。
每次在该服务器上调用产品时,都会使用这个新的TCP连接创建一个新线程,并且对话框会以一些"常见"请求开始。
在这个对话框的某个步骤,线程需要运行一个Lua脚本来继续这个过程:不是使用一个通用过程,而是为每个产品使用一个特定的过程。
这是我的问题:
当我运行Lua脚本时,我需要使用Thread类(当前线程)的方法。由于可以在Lua脚本中使用的C函数的Extern"C"声明,我无法调用当前线程的方法,因为我不知道如何编程(或背后的原理)这个交换的结构:-线程有N个方法在IP上发送数据,具体取决于协议(我们将此方法称为mythread::CClass_fn_X())-为Lua注册的函数C将被调用Lua_ FN_。这只是一个使用Lua)计算的参数调用CClass_fn_X()的网关
如果在LUA_FN_X()中我想做一个"this->CClass_FN_X()",我不能,因为C LUA函数没有引用线程的"this"。
在过去的几天里,我尝试了各种各样的方法,但我找不到一个好的解决方案(或简单的任何解决方案)来解决我的问题。
请帮帮我,我不需要代码,而只是原则。
另外,Lua解释器线程安全吗?我可以在不同的线程中分别运行Lua脚本吗?
为了回答您的最后一个问题,如果您在不同的操作系统线程中使用相同的Lua状态,那么Lua不是操作系统线程安全的,但您可以在不同的OS线程中安全地运行不同的Lua状态。
不要将操作系统线程与Lua线程混淆,Lua线程是协同程序,在相同的状态下运行。
有几种方法可以做到这一点。如果只有一个非主线程可以调用Lua脚本,那么脚本只需要知道它所属的线程对象,并在调用C++时将其作为参数提供。有很多策略可以在那里工作,但其中之一是创建一个全局变量,该变量是线程的轻用户数据(基本上是一个足以识别线程的指针或句柄)。然后,当您调用脚本时,脚本会使用该轻用户数据调用C函数:您的C函数必须假设接收到的用户数据实际上是线程的指针、句柄或整数(无论您的策略如何),这样它才能找到正确的thread实例并调用适当的方法。例如,C++端:
// tell Lua which thread:
lua_pushlightuserdata(L, threadHandle); // threadHandle uniquely identifies thread
lua_setglobal(L, "scriptThread");
// call script:
// assumes you loaded script before and saved the compiled chunk
// as global variable "script" (other SO question shows how to do it)
lua_getglobal(L, "script");
lua_pcall(L, 0, 0, 0);
和Lua脚本:
-- call C++ func:
LUA_FN_X(scriptThread);
以及您在Lua状态下注册为Lua_FN_X:的C/C++包装函数
void cwrapper(lua_State* L)
{
Thread* thread = (Thread*)lua_touserdata(L, -1);
thread->CClass_fn_X();
}
Lua除了将一个轻用户数据传回C++之外,不能对它做太多的处理。如果您想查询各种线程方法,并且有几个线程实例可以调用Lua脚本,那么使用完整的userdata可能是值得的。