我正在研究客户端服务器系统,并且遇到了多个客户端同时执行操作的问题。我们可以通过锁定代码的关键部分来解决这个问题,这可以确保第一个客户端在第二个客户端进入代码块之前完成操作。我的问题是:我们的服务器也是集群的,因此可以存在服务器本身的多个实例,这会重现与以前相同的问题。我们怎么能解决这个问题呢? 谢谢!
扩展问题:第一个用户正在检查操作是否有效并获得“是”响应。第二个用户正在检查某个操作是否有效,并在第一个用户完成其操作之前获得“是”响应。但是第一个用户的操作应该使第二个用户的操作无效。问题是每个用户几乎同时进行检查。
答案 0 :(得分:1)
有关您的特定问题的更多详细信息将有助于获得一个好的解决方案 - 但是,听起来您需要某种形式的进程间/跨服务器锁定。在.NET框架(或Win32 API)中没有任何东西可以简化这一点 - 你不得不推出自己的解决方案,我担心。
您可能希望查看某种群集排队机制,以便只有一个进程/线程正在执行操作。在您的整体设计和您尝试解决的问题中,这可能是也可能不容易。或者,您可以使用中央权限(如数据库)和锁定结构来确定是否已启动特定操作的锁定。问题在于,由于需要不断与数据库进行交互,很难使这种解决方案能够很好地扩展。
您可能拥有的另一个选项是允许多个进程同时尝试处理相同的操作,但只允许完成一个操作。这可能很难确保 - 但是执行额外工作并抛弃它比在不断检查其他人是否已经在完成工作时更便宜(计算上)。
答案 1 :(得分:1)
听起来你的设计很糟糕。如果可能,您的服务根本不应保持状态。这样,就没有共享状态可以继续。
如果必须维护状态,则必须将对该共享状态的所有访问联锁起来。您可以在C#中使用“lock”关键字:
private static object _stateLocker = new object();
private static int _someSharedState = 0;
public void SomeAction()
{
lock (_stateLocker)
{
_someSharedState ++;
}
}
public int GetValue()
{
lock (_stateLocker)
{
return _someSharedState; }
}