#cell #cooperative #thread-safe #global #static

threadcell

只能由拥有线程访问其值的cell

18个版本 (4个稳定版)

1.0.3 2023年5月5日
1.0.0 2023年4月20日
0.12.0 2023年3月20日
0.8.2 2022年12月11日
0.8.1 2022年9月13日

#518并发

Download history 266/week @ 2024-04-09 70/week @ 2024-04-16 78/week @ 2024-04-23 34/week @ 2024-04-30 23/week @ 2024-05-07 10/week @ 2024-05-21 32/week @ 2024-05-28 12/week @ 2024-06-04 11/week @ 2024-06-11 4/week @ 2024-07-02 18/week @ 2024-07-09 27/week @ 2024-07-16 31/week @ 2024-07-23

每月80次下载
onsen 中使用

MIT/Apache

27KB
420

只能由拥有线程访问其值的cell。类似于Mutex,但没有阻塞锁。ThreadCell的访问在线程之间是合作传递的。

语义

ThreadCell

ThreadCell及其引用总可以发送到其他线程

  • 由线程拥有的ThreadCell只允许那个线程
    • 访问其值
    • 丢弃cell。
    • 将Cell设置为无主状态。
  • 在无主的ThreadCell上,任何线程都可以
    • 获取所有权
    • 丢弃它

没有拥有ThreadCell的线程访问其值将导致panic。API中有'try_*'变体,它不会panic,而是返回一个bool或Option。

API

Threadcell的使用有两种方式。从'v0.11'开始,它们是互斥的。

获取/释放

提供了对ThreadCell所有权的手动控制。这里的缺点是,当持有ThreadCell的线程panic时,这个cell仍然由已死的线程拥有。要么需要发现这些情况然后steal()这个cell,或者只在panic不可能或终止整个进程的情况下使用。此API还可以用于实现自定义保护类型。

保护

threadcell::Guardthreadcell::GuardMut为threadcell提供了适当的获取/释放操作。每个threadcell只能有一个保护活动。只要线程有一个Guard,threadcell就属于那个线程,并且当Guard被丢弃时,将释放threadcell。

保护实现DerefDerefMut,使访问threadcell更加方便。

用例

  • 需要静态可变全局变量的单线程应用程序可以使用ThreadCell<RefCell<T>>
  • 一个 static mut ThreadCell<T> 需要使用不安全代码,但实际上是安全的,因为 ThreadCell 可以防止并发访问。
  • 在同步原语之外进行同步的情况下,在多个线程之间共享数据。

依赖项