6 个版本

0.2.3 2023 年 1 月 28 日
0.2.2 2022 年 5 月 18 日
0.2.1 2021 年 9 月 26 日
0.1.1 2021 年 4 月 23 日

#497 in 并发

MIT/Apache

46KB
763

range-lock - Vec 的多线程范围锁

项目主页

Git 仓库

Github 仓库

本 crate 提供了多线程访问单个 Vec 实例的锁/mutex。

任何线程都可以请求对 Vec 的某个片段的独占访问。如果没有任何其他线程同时持有访问重叠片段的权限,则会授予这种访问权限。

使用方法

将以下内容添加到您的 Cargo.toml 中

[dependencies]
range-lock = "0.2"

VecRangeLock 示例使用

通用 VecRangeLock

use range_lock::VecRangeLock;
use std::sync::Arc;
use std::thread;

let lock = Arc::new(VecRangeLock::new(vec![1, 2, 3, 4, 5]));

thread::spawn(move || {
    let mut guard = lock.try_lock(2..4).expect("Failed to lock range 2..4");
    assert_eq!(guard[0], 3);
    guard[0] = 10;
});

RepVecRangeLock 示例使用

RepVecRangeLock 是一种受限范围锁,为线程提供对切片交错模式的访问。

锁定 RepVecRangeLock 比锁定 VecRangeLock 更轻量级。线程不能自由选择切片范围,而只能通过指定模式偏移量来选择重复的切片模式。

请参见以下示例。

use range_lock::RepVecRangeLock;
use std::sync::Arc;
use std::thread;

let data = vec![1, 2, 3,  // <- cycle 0
                4, 5, 6]; // <- cycle 1
//              ^  ^  ^
//              |  |  |
//              |  |  offset-2
//       offset-0  offset-1

let lock = Arc::new(RepVecRangeLock::new(data,
                                         1,    // slice_len: Each slice has 1 element.
                                         3));  // cycle_len: Each cycle has 3 slices (offsets).
thread::spawn(move || {
    // Lock slice offset 1:
    let mut guard = lock.try_lock(1).expect("Failed to lock offset.");

    assert_eq!(guard[0][0], 2);     // Cycle 0, Slice element 0
    assert_eq!(guard[1][0], 5);     // Cycle 1, Slice element 0

    guard[0][0] = 20;               // Cycle 0, Slice element 0
    guard[1][0] = 50;               // Cycle 1, Slice element 0
});

未来版本待办事项

以下新功能可能是未来版本的候选者

  • 睡眠锁,在锁定竞争的情况下。
  • 添加对数组的支持。

许可

版权(c)2021-2023 Michael Büsch <[email protected]>

根据您的选择,许可在 Apache 许可证版本 2.0 或 MIT 许可证下。

无运行时依赖