gpt4 book ai didi

c++ - Reader Writer Lock 支持低优先级的写者

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:34 25 4
gpt4 key购买 nike

我正在尝试寻找(或实现)支持低优先级写入器的读取器/写入器锁,但未能成功研究任何现有解决方案。

我所说的低优先级写入器的意思是:“将让位给即将到来的读者或普通写入器”。

如果有持续不断的读者流,肯定会导致饥饿,但这可以通过定时锁变体(“尝试定时低优先级写入器锁”,然后在超时时切换到正常锁)或通过更改来解决读取器的发布方式(可能会定期暂停读取一小段时间)。

如果有任何文献描述这些东西,我还没有找到。

如果有利用常规锁的已知(正确!)解决方案,我将不胜感激。

最佳答案

我不知道有什么 100% 像你的建议,但有一些现有的接口(interface)很接近:

许多现有的 r/w 锁 API 都有一个“try lock”接口(interface),例如 UN*X 系统上的 pthread_rwlock_trywrlock()。这些是无等待的,只有在没有人拥有它或已经等待它的情况下才会获取锁。

您通常会使用这种自旋来锁定,和/或人为地延迟尝试代码(后退)。 IE。有这样的代码:

for (count = 0; count < MAX_SPINS && (locked = trywrlock(lock)); count++);
if (locked) {
delay(some_backoff);
wrlock(lock); /* or try spinning loop above again ? */
}

不幸的是,这并不是您所要求的;它会晚点获得锁,但是低优先级的写入器将在 CPU 上自旋和/或由于(可能是不必要的)退避而以延迟的方式获得它。

Solaris 内核有一个接口(interface) rw_tryupgrade(9f)可用于测试当前线程是否是锁上唯一的读取器而没有写入器等待,如果是,则将锁升级为独占/写入,即您的代码如下:

if (!rw_tryenter(lock, RW_WRITER)) {
rw_enter(lock, RW_READER); /* this might wait for a writer */
if (!rw_tryupgrade(lock)) { /* this fails if >1 reader / writer waiting */
/* do what you must to if you couldn't get in immediately */
}
}

这有点接近您的要求,但仍然不完全相同 - 如果失败,您必须放弃读锁,可能会后退(等待),重新获取读锁,尝试升级。该过程又相当于旋转。

此外,许多 UNIX 系统至少实际上按调度优先级顺序执行等待程序唤醒;因此,在尝试普通的等待 wrlock() 调用之前,您必须将线程设置为最低优先级(如果有必要,人为地);凭借调度程序的工作方式,在您的线程等待时其他任何人想要相同的写锁都会在此之前获得它。尽管在多处理器/核心系统上不一定能保证......

最后,SymbianOS(Symbian^3 版本)有一个 RRWlock 类,可以使读者优先于作者,这样如果有读者在等待/进来,它会故意让作者挨饿。同样,这并不完全是您想要的行为,因为它会影响给定锁上的所有写入器,而不仅仅是特定的写入器。

恐怕您必须编写自己的优先级锁,使用两个写入器唤醒队列。

关于c++ - Reader Writer Lock 支持低优先级的写者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5081143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com