#lock #real-time #rwlock #thread

pflock

一种公平的读写锁,可以减少读者最坏情况下的阻塞。特别适用于多处理器实时系统。

5 个版本

0.2.0 2023年1月30日
0.1.3 2020年8月3日
0.1.2 2020年8月3日
0.1.1 2020年8月3日
0.1.0 2020年8月3日

#842并发

Download history 447/week @ 2024-03-06 450/week @ 2024-03-13 514/week @ 2024-03-20 362/week @ 2024-03-27 485/week @ 2024-04-03 378/week @ 2024-04-10 593/week @ 2024-04-17 414/week @ 2024-04-24 306/week @ 2024-05-01 368/week @ 2024-05-08 415/week @ 2024-05-15 462/week @ 2024-05-22 518/week @ 2024-05-29 626/week @ 2024-06-05 795/week @ 2024-06-12 432/week @ 2024-06-19

2,459 每月下载量
libhermit-rs 中使用

MIT 许可证

10KB
74 代码行

PFlock:公平的读写锁

本库提供了一种公平的读写锁,如 Brandenburg 等人在论文《"Reader-Writer Synchronization for Shared-Memory Multiprocessor Real-Time Systems"》中所描述。该论文可在此处查看:"Reader-Writer Synchronization for Shared-Memory Multiprocessor Real-Time Systems"

读写者优先、写者优先以及任务公平的读写锁在多处理器实时系统中会导致不必要的阻塞。本文提出了一种新的公平读写锁,可以显著减少读者最坏情况下的阻塞。

示例

use pflock::PFLock;

let lock = PFLock::new(5);

// many reader locks can be held at once
{
    let r1 = lock.read();
    let r2 = lock.read();
    assert_eq!(*r1, 5);
    assert_eq!(*r2, 5);
} // read locks are dropped at this point

// only one write lock may be held, however
{
    let mut w = lock.write();
    *w += 1;
    assert_eq!(*w, 6);
} // write lock is dropped here

自旋与挂起

PFLock 是一个专门针对 短临界区 的自旋锁,在阻塞时不挂起线程。论文的第3节讨论了这一点

“短”和“长”这两个术语源于(直观地)自旋只适用于短临界区,因为自旋会浪费处理器时间。然而,最近的两项研究表明,在考虑开销的情况下,自旋通常比挂起更可取 [11, 15]。基于这些趋势(以及空间限制),本文将重点放在短资源上,并将长资源的读写同步留待未来研究。

C 实现

C 的参考实现在分支 cnord/ffi 的目录 pflock_c/ 中提供。使用以下命令使用参考实现运行测试:RUSTFLAGS="--cfg c_reference",例如。

RUSTFLAGS="--cfg c_reference" cargo test

许可证

所有代码均受 MIT 许可证的约束,但 pflock_c/ 的 C 实现有自己的许可证,在文件中指定。

@inproceedings{brandenburg2009reader,
  title={Reader-writer synchronization for shared-memory multiprocessor real-time systems},
  author={Brandenburg, Bj{\"o}rn B and Anderson, James H},
  booktitle={2009 21st Euromicro Conference on Real-Time Systems},
  pages={184--193},
  year={2009},
  organization={IEEE}
}

依赖项

~160KB