【问题标题】:Can Interlocked be used in a Finalizer?可以在终结器中使用 Interlocked 吗?
【发布时间】:2013-03-14 19:48:44
【问题描述】:

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

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

【问题讨论】:

    标签: c# finalizer interlocked


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多