情况:我有一个多线程服务器应用程序,未定义数量的客户端连接到该应用程序。在服务器启动时,我创建一个Lua状态,设置所有函数,并且对于来自客户端的每个新连接,我创建一个lua_newthread
的子状态。在"随机"在连接期间,客户端可能会请求Lua应该处理的内容,因此我查找应该为客户端请求运行的函数并调用它。然后,此函数还可以调用主机应用程序(服务器)中的一个函数,该函数使用lua_yield
生成执行,以等待来自客户端的响应。当响应进来时,我恢复了连接的Lua状态。基本上我有两个Lua访问点,Call
和Resume
。
现在,我知道Lua本身并不是线程安全的,如果我不保护全局状态,那么我目前正在做的事情可能会因多个客户端而失败。我读到的tutorial建议修改Lua,以实现锁定函数,这些函数已经将每个操作都包装在Lua的代码中。
我的问题是,如果我将Call
和Resume
个调用包裹在C#lock
块中,当然使用相同的对象,那么是否也能有效地保护全局状态?如果只有一个呼叫通过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);
}
}