强制修改特定对象和任何扩展是原子的

时间:2013-02-10 13:31:01

标签: c# concurrency locking

我有一点读者/作家的问题。

我有一个特定对象的静态集合,可以被许多读者和作者同时访问。

作者将从集合处理程序中获取一个项目,然后以某种方式对其进行修改。

读者可以从收集处理程序中获取该特定项目,然后以某种方式显示它。

现在我意识到这个问题的标准解决方案是创建一个锁(或一个ReaderWriter)并强制每个编写者和读者进入锁。问题是我并不是唯一一个添加读者/编写者的人,所以有人可能会忘记在实现中使用锁并破坏所有内容。

从对象的角度来看,是否有一种方法可以强制所有更改以原子方式进行?请记住,此对象将以多种形式进行扩展,并且还必须以这种方式进行约束。

1 个答案:

答案 0 :(得分:2)

如果您的对象的消费者无法信任遵守安全规则,那么您就会遇到大问题。我可以看到两个解决方案:

1)什么都不做。如果您的消费者编写破损的代码,那么他们发现自己所处的痛苦将是不再这样做的好动力。

1a)你可以让他们的痛苦更加难以忍受,比如让你的对象以某种方式检测它何时被读取而没有读锁定并抛出异常。这就是我们在为JScript和VBScript引擎设计线程规则时所做的事情;如果用户在不支持该方法的线程上调用方法,则引擎返回“catestrophic failure”错误代码。引擎的用户不会犯两次错误;他们很快就知道哪个是正确的线程,哪个是错误的线程,并停止调用错误的线程。

这是一个更好的解决方案,而不是简单地允许呼叫在大多数时间内成功,然后在一百万次中出现一些疯狂的竞争条件问题。

2)将获取锁的责任移到对象中。让消费者正常使用该物体;无论何时读取或写入,该对象都会取出自己的读写器锁。