线程安全的Lua

时间:2015-12-13 20:57:52

标签: c# multithreading lua thread-safety

情况:我有一个多线程服务器应用程序,未定义数量的客户端连接到该应用程序。在服务器启动时,我创建一个Lua状态,设置所有函数,并且对于来自客户端的每个新连接,我创建一个lua_newthread的子状态。在"随机"在连接期间,客户端可能会请求Lua应该处理的内容,因此我查找应该为客户端请求运行的函数并调用它。然后,此函数还可以调用主机应用程序(服务器)中的一个函数,该函数使用lua_yield生成执行,以等待来自客户端的响应。当响应进来时,我恢复了连接的Lua状态。基本上我有两个Lua访问点,CallResume

现在,我知道Lua本身并不是线程安全的,如果我不保护全局状态,那么我目前正在做的事情可能会因多个客户端而失败。我读到的tutorial建议修改Lua,以实现锁定函数,这些函数已经将每个操作都包装在Lua的代码中。

我的问题是,如果我将CallResume个调用包裹在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);
    }
}

0 个答案:

没有答案