2个不稳定版本
0.2.0 | 2020年4月4日 |
---|---|
0.1.0 | 2020年4月3日 |
#72 in #callback
14KB
187 行
finarc
此包提供类型FinArc,它是一种带有终结器回调的Arc,在克隆时复制内部数据,在最后一个实例被释放时调用终结器。
这可能在以下情况下很有用:您有内部同步类型,该类型是可复制的(即Clone
),但其所有克隆都属于单个资源,并且该资源必须在最后一个克隆被释放时释放。
这样的一个例子是 Channel
在 lapin
包中,它属于RabbitMQ通道。它是可复制的,但它不遵循RAII原则,也就是说,在释放时不关闭,任何使用通道副本的线程都可能关闭它, leaving other threads to face Rabbit errors when they try to use this already closed channel.
假设您想创建围绕此类型的自己的包装器。您可以使用 Arc<Mutex/RwLock<Channel>>
,但这效率不高,因为Channel已经同步(它只是Arc<Mutex/RwLock>
的集合),因此您需要克隆它们,但在此同时,还需要跟踪副本数量,以在释放前调用.close()
。FinArc允许您这样做,您只需提供一个在最后一个通道副本被释放时被调用的回调,即FnOnce(&mut Channel)
。
与Arc
不同,FinArc<T, F>
实现了DerefMut
到T,因为每个FinArc实例都拥有自己的T副本。
当前版本:0.2.0
许可:MIT OR Apache-2.0