线程安全的 Lua

情况:我有一个多线程服务器应用程序,未定义数量的客户端连接到它。在服务器启动时,我创建了一个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);
    }
}
点赞