#原子 #自旋锁 #等待 #跨平台 #唤醒 #线程 #操作

无需 std atomic-wait

跨平台原子等待和唤醒(也称为futex)功能

5 个版本 (3 个稳定版)

1.1.0 2023年1月2日
1.0.1 2022年9月27日
0.2.0 2022年9月25日
0.1.0 2022年9月16日

#211并发

Download history • Rust 包仓库 920/week @ 2024-03-14 • Rust 包仓库 944/week @ 2024-03-21 • Rust 包仓库 1023/week @ 2024-03-28 • Rust 包仓库 1401/week @ 2024-04-04 • Rust 包仓库 1114/week @ 2024-04-11 • Rust 包仓库 1341/week @ 2024-04-18 • Rust 包仓库 1784/week @ 2024-04-25 • Rust 包仓库 1911/week @ 2024-05-02 • Rust 包仓库 1634/week @ 2024-05-09 • Rust 包仓库 1655/week @ 2024-05-16 • Rust 包仓库 2017/week @ 2024-05-23 • Rust 包仓库 2323/week @ 2024-05-30 • Rust 包仓库 2990/week @ 2024-06-06 • Rust 包仓库 2634/week @ 2024-06-13 • Rust 包仓库 1738/week @ 2024-06-20 • Rust 包仓库 1782/week @ 2024-06-27 • Rust 包仓库

9,635 每月下载次数
10 crates 中使用

BSD-2-Clause 许可

10KB
151 代码行

跨平台原子等待和唤醒(即 futex)功能。

此 crate 只支持在 Linux、FreeBSD、Windows 和 macOS 上都有的功能。也就是说

  • 只支持 AtomicU32。 (Linux 当前只支持 32 位 futexes。)
  • 只支持 "等待"、"唤醒一个" 和 "唤醒所有" 操作。 (Linux 支持更多操作,但 Windows 和 macOS 不支持。)
  • 没有超时。 (macOS 没有稳定/公开的超时 API。)
  • 唤醒操作不返回唤醒的线程数。 (只有 Linux 支持。)

支持的平台:Linux 2.6.22+、FreeBSD 11+、Windows 8+、Windows Server 2012+、macOS 11+、iOS 14+、watchOS 7+。

用法

use std::sync::atomic::AtomicU32;
use atomic_wait::{wait, wake_one, wake_all};

let a = AtomicU32::new(0);

wait(&a, 1); // If the value is 1, wait.

wake_one(&a); // Wake one waiting thread.

wake_all(&a); // Wake all waiting threads.

实现

在 Linux 上,这使用 SYS_futex 系统调用。

在 FreeBSD 上,这使用 _umtx_op 系统调用。

在 Windows 上,这使用 WaitOnAddressWakeByAddress API。

在 macOS(以及 iOS 和 watchOS)上,这使用 libc,利用与 C++20 的 atomic_waitatomic_notify 函数相同的(ABI 稳定)函数。

依赖关系

~0–13MB
~96K SLoC