当多个独立队列可能保存对同一个托管对象的引用时,在所有队列完成引用后,确定性地处理该对象的好方法是什么?
假设有问题的对象同时拥有托管和非托管资源。
注意:调用Find()函数来测试一个队列的dequeue函数内的所有队列,并不是我想到的。
答案 0 :(得分:1)
如果可以依赖消费者在他们应该的时候致电Dispose
,那么互锁参考计数就足够了。如果他们不能并且如果受保护的资源即使在仍在使用时被回收也不会危及安全性,那么可以使用终结器来保护引用计数对象。如果在使用资源时回收资源可能会危及安全性,那么可能需要有一个对象,该对象保留对该对象的所有使用者的长弱引用列表,并且还维护对该列表的静态引用。无论何时处置任何消费者,或者终结者触发保护对象,它都应该(以线程安全的方式)检查所有弱引用并删除所有已经变为无效或识别已经处置的对象的引用。如果没有引用,则guard对象应使自身无效,删除对其弱引用列表的静态引用,并释放资源。如果保护对象的终结器被触发但参考仍然存在(在某些复活方案中可能发生),则应重新注册以进行最终确定。
请注意,虽然执行原子列表更新的常见模式是使用CompareExchange
并引用不可变列表,但使用该技术需要将引用存储在除保护对象之外的某些内容中哪个是静态参考。让静态引用标识保护对象会使保护对象的终结器无效,但是没有对长弱引用列表的静态引用会使系统使引用无效,而由此识别的对象仍然存在并且可以复活。 / p>