C# 线程安全Lua
情况:我有一个多线程服务器应用程序,有未定义数量的客户端连接到该应用程序。在服务器启动时,我创建一个Lua状态,设置所有函数,对于来自客户端的每个新连接,我使用C# 线程安全Lua,c#,multithreading,lua,thread-safety,C#,Multithreading,Lua,Thread Safety,情况:我有一个多线程服务器应用程序,有未定义数量的客户端连接到该应用程序。在服务器启动时,我创建一个Lua状态,设置所有函数,对于来自客户端的每个新连接,我使用Lua\u newthread创建一个子状态。在连接过程中的“随机”点,客户机可能会请求应该由Lua处理的内容,因此我查找应该为客户机请求运行的函数并调用它。然后,此函数还可以调用主机应用程序(服务器)中的一个函数,该函数通过lua_yield生成执行,以等待来自客户端的响应。当响应到来时,我恢复连接的Lua状态。基本上,我有两个Lua访
Lua\u newthread
创建一个子状态。在连接过程中的“随机”点,客户机可能会请求应该由Lua处理的内容,因此我查找应该为客户机请求运行的函数并调用它。然后,此函数还可以调用主机应用程序(服务器)中的一个函数,该函数通过lua_yield
生成执行,以等待来自客户端的响应。当响应到来时,我恢复连接的Lua状态。基本上,我有两个Lua访问点,Call
和Resume
现在,我知道Lua本身不是线程安全的,如果我不保护全局状态,我当前所做的工作可能会在多个客户端上失败。我读过的一篇文章建议修改Lua,以实现锁定功能,这些功能已经在Lua的代码中封装了每个操作
我的问题是,如果我将我的调用
和恢复
调用包装在C#锁
块中,当然它们使用相同的对象,那么这是否也能有效地保护全局状态?如果只允许一个呼叫通过Lua VM?或者,在某种情况下,这是不够的
例如:
private object syncLock = new object();
public void Call(IntPtr L, string functionName)
{
lock(syncLock)
{
lua_getglobal(L, functionName);
lua_resume(L, 0);
}
}
public void Resume(IntPtr L, string response)
{
lock(syncLock)
{
lua_pushstring(L, response);
lua_resume(L, 1);
}
}
在Lua状态上使用锁应该足够了。我认为锁定连接的Lua状态不会有帮助,因为这只属于连接。我可以锁定全局状态,但无论是使用全局状态还是专用的锁定对象,我想都不会有什么不同。