Interlocked可以在终结器中使用吗?

本文关键字:Interlocked | 更新日期: 2023-09-27 18:04:04

假设我需要在终结器中清理一些托管资源,或者至少以线程安全的方式将其记录在需要清理的地方。据我所知,在终结器中使用锁是严格禁止的,但是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.

而且,似乎所有的终结器都在一个线程上运行,这是一个保证的行为还是只是一个实现细节?如果这只是一个细节,那么在终结器内部获取锁(比如,在无锁队列中推送作业)是否可以,前提是锁永远不会在其他任何地方被获取?

Interlocked可以在终结器中使用吗?

在一个线程中运行的终结器是一个实现细节(它不太可能改变,因为它会违反MS所坚持的非常严格的兼容性标准)。

锁在终结器中实际上是可以的。它们可能会成为性能或正确性问题,但这并不是因为它们作为Finalizer的一部分运行。这些是锁的一般属性。Interlocked类也可以使用

请记住,终结器可以以任何顺序执行,并且可能并发执行。而且不是逆依赖顺序而是随机顺序