1

我正在开发一个客户端服务器系统,并且遇到了多个客户端同时执行一个操作的问题。我们可以通过锁定代码的关键部分来解决这个问题,这样可以确保第一个客户端在第二个客户端进入代码块之前完成操作。我的问题是:我们的服务器也是集群的,因此服务器本身可以存在多个实例,这会重现与以前相同的问题。我们如何解决这个问题?谢谢!

扩展问题:第一个用户正在检查一个操作是否有效并得到一个是的响应。第二个用户正在检查一个动作是否有效,并且在第一个用户完成他/她的动作之前得到一个是的响应。但是第一个用户的操作应该使第二个用户的操作无效。问题是每个用户几乎同时进行检查。

4

2 回答 2

1

有关您的特定问题的更多详细信息将有助于获得一个好的解决方案 - 但是,听起来您需要某种形式的进程间/跨服务器锁定。.NET 框架(或 Win32 API)中没有任何东西可以让这变得简单——恐怕你必须推出自己的解决方案。

您可能想研究某种集群排队机制,以便只有一个进程/线程正在执行一个操作。这在您的整体设计和您试图解决的问题中可能会或可能不会容易。或者,您可以使用中央权限(如数据库)和锁定结构来确定特定操作的锁定是否已经启动。问题在于,由于需要不断与数据库进行交互,因此很难很好地扩展这种解决方案。

您可能拥有的另一种选择是允许多个进程尝试同时处理相同的操作,但只允许一个完成。这可能很难确保 - 但执行额外工作并将其丢弃比不断检查其他人是否已经在做工作更便宜(计算上)。

于 2010-04-15T23:39:04.230 回答
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;    }
}
于 2010-04-16T01:10:12.497 回答