以上是作者优先于读者的读者写问题解决方案。
假设最初有 1000 个读取器开始执行代码来读取数据(假设读取数据代码很大,每个线程需要 1 秒),然后 1 个写入器尝试写入数据。所以作者必须等待 1000 个读者首先完成(即 1000 秒)。
例如,在一个应用程序中,1 个 writer 更新时间,许多 reader 读取时间,writer 必须等待 1000 秒,这是巨大的。
是否有任何解决方案,当作者尝试写入时,所有读者都将被抢占,直到作者完成其任务?
以上是作者优先于读者的读者写问题解决方案。
假设最初有 1000 个读取器开始执行代码来读取数据(假设读取数据代码很大,每个线程需要 1 秒),然后 1 个写入器尝试写入数据。所以作者必须等待 1000 个读者首先完成(即 1000 秒)。
例如,在一个应用程序中,1 个 writer 更新时间,许多 reader 读取时间,writer 必须等待 1000 秒,这是巨大的。
是否有任何解决方案,当作者尝试写入时,所有读者都将被抢占,直到作者完成其任务?
“抢占”究竟是什么意思?你不能把它们从 CPU 上取下来,因为这并不能解决问题。读者希望他们正在阅读的状态是稳定的。如果你“暂停”阅读器,获取写锁,修改状态,释放锁并恢复阅读器,他们将看到改变的状态和故障。
读锁的目的是确保读取器执行时数据不会改变。如果您删除该属性,则此锁定策略将不再有意义。
由于读者的数量远多于作者,因此您最终可能会饿死作者线程。您可以引入的一个简单策略是,如果写入者正在等待写入,您可以停止向即将到来的读取请求授予更多读取锁。这至少可以确保作者不会饿死。writer 的延迟取决于实际用例。