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 在 并发 中
每月80次下载
在 onsen 中使用
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::Guard
和threadcell::GuardMut
为threadcell提供了适当的获取/释放操作。每个threadcell只能有一个保护活动。只要线程有一个Guard
,threadcell就属于那个线程,并且当Guard
被丢弃时,将释放threadcell。
保护实现Deref
和DerefMut
,使访问threadcell更加方便。
用例
- 需要静态可变全局变量的单线程应用程序可以使用
ThreadCell<RefCell<T>>
。 - 一个
static mut ThreadCell<T>
需要使用不安全代码,但实际上是安全的,因为ThreadCell
可以防止并发访问。 - 在同步原语之外进行同步的情况下,在多个线程之间共享数据。