4个稳定版本
1.2.1 | 2024年3月27日 |
---|---|
1.2.0 | 2023年2月18日 |
1.1.0 | 2023年1月31日 |
1.0.0 | 2023年1月28日 |
#5 in #所有权
每月下载 25次
在handoff中使用
26KB
264 行
twinsies
Twinsies是一种特殊的共享指针,类似于Arc
,其中两个特定的对象(称为Joint
)共享对底层对象的联合所有权。与Arc
相比,关键区别在于当任一Joint
对象超出作用域时,底层对象将被丢弃。
由于单个Joint
本身无法保持共享对象的存活,因此不能像Arc
那样直接解引用。相反,它必须通过.lock()
锁定。在锁定状态下,只要JointLock
存在,对象就能保证存活。如果Joint
在其伙伴锁定时被丢弃,对象将保持存活,但一旦另一个Joint
不再锁定,对象将立即被丢弃。
Twinsies旨在用于无缓冲通道、联合句柄和异步Waker
等场景,在这些场景中,一些共享状态仅在两个部分仍然对其感兴趣时才应该被保留。
示例
use twinsies::Joint;
use std::cell::Cell;
let (first, second) = Joint::new(Cell::new(0));
assert_eq!(first.lock().unwrap().get(), 0);
first.lock().unwrap().set(10);
assert_eq!(second.lock().unwrap().get(), 10);
drop(second);
// Once `second` is dropped, the shared value is gone
assert!(first.lock().is_none())
锁定保持存活
use twinsies::Joint;
use std::cell::Cell;
let (first, second) = Joint::new(Cell::new(0));
let lock = first.lock().unwrap();
lock.set(10);
assert_eq!(second.lock().unwrap().get(), 10);
second.lock().unwrap().set(20);
assert_eq!(lock.get(), 20);
drop(second);
assert_eq!(lock.get(), 20);
lock.set(30);
assert_eq!(lock.get(), 30);
// As soon as the lock is dropped, the shared value is gone, since `second`
// was dropped earlier
drop(lock);
assert!(first.lock().is_none());