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中使用

MPL-2.0 许可证

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());

无运行时依赖

功能