0

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

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

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

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

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

那么有没有办法从对象的角度强制所有更改以原子方式进行?请记住,该对象将以多种形式扩展,并且它们也必须以这种方式进行约束。

4

1 回答 1

2

如果您的对象的消费者不能被信任遵守安全规则,那么您就有一个大问题。我可以看到两种解决方案:

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

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

这是一个更好的解决方案,而不是简单地让调用在大多数情况下成功,然后在百万分之一的情况下死于一些疯狂的竞争条件问题。

2)将获取锁的责任移到对象中。让消费者正常使用对象;对象在读取或写入时取出自己的读写器锁。

于 2013-02-10T15:12:50.867 回答