假设我需要在终结器中清理一些托管资源,或者至少以需要清理的线程安全方式将其记录在某处。据我了解,在终结器中使用锁是严格禁止的,但是 Interlocked 类呢?这安全吗,不会导致死锁吗?
static int deadentries;
~Item() { Interlocked.Increment(ref deadentries); }
public static T Get(int id, Action<T> init) {
T ret;
WeakReference<T> tref;
if (cache.TryGetValue(id, out tref)) {
if (tref.TryGetTarget(out ret)) return ret;
else Interlocked.Decrement(ref deadentries);
}
if (deadentries * 2 > cache.Count) {
// etc. etc.
此外,似乎所有终结器都在一个线程上运行,这是有保证的行为还是只是实现细节?如果这只是一个细节,那么在终结器中获取锁(例如,将作业推送到无锁队列中)是否可以,前提是该锁永远不会被其他任何地方使用?