#arc #callback #finalization

finarc

在最后一次克隆释放时调用终结器的Arc

2个不稳定版本

0.2.0 2020年4月4日
0.1.0 2020年4月3日

#72 in #callback

MIT/Apache

14KB
187

API Docs Downloads

finarc

此包提供类型FinArc,它是一种带有终结器回调的Arc,在克隆时复制内部数据,在最后一个实例被释放时调用终结器。

这可能在以下情况下很有用:您有内部同步类型,该类型是可复制的(即Clone),但其所有克隆都属于单个资源,并且该资源必须在最后一个克隆被释放时释放。

这样的一个例子是 Channellapin 包中,它属于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>实现了DerefMutT,因为每个FinArc实例都拥有自己的T副本。

当前版本:0.2.0

许可:MIT OR Apache-2.0

无运行时依赖