22 个版本

新版本 0.3.2 2024 年 8 月 19 日
0.3.1 2024 年 8 月 15 日
0.3.0 2024 年 7 月 26 日
0.2.6 2024 年 7 月 20 日
0.1.11 2024 年 6 月 30 日

#120 in 并发

Download history 426/week @ 2024-06-12 207/week @ 2024-06-19 236/week @ 2024-06-26 679/week @ 2024-07-03 232/week @ 2024-07-10 328/week @ 2024-07-17 369/week @ 2024-07-24 69/week @ 2024-07-31 52/week @ 2024-08-07 295/week @ 2024-08-14

799 每月下载量
10 个 crates (8 直接)中使用

Apache-2.0

130KB
3.5K SLoC

RTSC - 实时同步组件 crates.io 页面 docs.rs 页面

实时应用程序中的数据同步需求与传统的高负载应用程序不同。主要区别在于实时同步组件必须谨慎遵循传统的操作系统方法,避免用户空间自旋循环和其他忙等待技术(参见 Rust 中的通道。第 2 部分,其中此类问题被清晰地描述)。

组件

此 crate 提供了一组适用于各种典型和自定义用例的实时安全同步组件。

  • 数据缓冲区
  • 同步单元
  • 同步/异步通道
  • 基于策略的通道
  • 信号量
  • 时间工具

锁定策略

所有组件都支持默认和自定义锁定策略,这意味着 Mutex 和 Condvar 实现可以替换为第三方实现,以供每个组件实例使用。

这允许在各种环境中使用 RTSC 组件,例如

  • 对于标准实时:使用 parking_lot_rt(Linux 以外的所有系统的默认值)。

  • 对于安全关键型实时使用提供的 [pi] 组件,这些组件支持优先级继承(Linux 的默认值,仅在 Linux 上工作,建议内核 5.14+)。

  • 对于延迟关键型实时使用基于自旋的锁。

  • 对于高负载的非实时使用 parking_lot 组件。

默认锁定策略

// For the implicit <T>
let (tx, rx) = rtsc::channel_bounded!(10);
tx.send(42).unwrap();

// For the explicit <T>
use rtsc::channel;

// The `Bounded` structure is used as a workaround to specify the default
// Mutex/Condvar, being destructuring to the sender and the receiver.
let channel::Bounded { tx, rx } = channel::Bounded::<i32>::new(10);

在 Linux 上,该 crate 使用内置的优先级继承 pi::Mutex 实现,并将其重新导出为 locking 模块。

在其他平台上,所有组件都使用来自parking_lot_rt - 一个知名 parking_lot crate 的实时分支。这是一个相对安全的 Mutex/RwLock,具有最小的用户空间自旋等待。该模块也被重新导出为 locking

自定义锁定策略

crate 组件提供了指定第三方 Mutex/Condvar 实现的 API。

// Forcibly use the parking_lot_rt Mutex/Condvar
let (tx, rx) = rtsc::channel::bounded::<i32,
    parking_lot_rt::RawMutex, parking_lot_rt::Condvar>(1);

注意:异步通道仅使用 parking_lot_rt 锁定。

支持的互斥锁

所有实现了来自 lock_api crate 的 locking_api::RawMutex trait 的互斥锁。

支持的条件变量

对于条件变量,必须实现 condvar_api::RawCondvar trait。

此 trait 对以下内容自动实现

  • 提供的内置锁

  • parking_lot::Condvar (需要 parking_lot 功能)

参考

RTSC 是 RoboPLC 项目的一部分。

依赖项

~3.5–9MB
~91K SLoC