Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程安全Lua_C#_Multithreading_Lua_Thread Safety - Fatal编程技术网

C# 线程安全Lua

C# 线程安全Lua,c#,multithreading,lua,thread-safety,C#,Multithreading,Lua,Thread Safety,情况:我有一个多线程服务器应用程序,有未定义数量的客户端连接到该应用程序。在服务器启动时,我创建一个Lua状态,设置所有函数,对于来自客户端的每个新连接,我使用Lua\u newthread创建一个子状态。在连接过程中的“随机”点,客户机可能会请求应该由Lua处理的内容,因此我查找应该为客户机请求运行的函数并调用它。然后,此函数还可以调用主机应用程序(服务器)中的一个函数,该函数通过lua_yield生成执行,以等待来自客户端的响应。当响应到来时,我恢复连接的Lua状态。基本上,我有两个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状态不会有帮助,因为这只属于连接。我可以锁定全局状态,但无论是使用全局状态还是专用的锁定对象,我想都不会有什么不同。