代码之家  ›  专栏  ›  技术社区  ›  Muhammad Hasan Khan

锁定(syncObject)何时可以引发异常?

  •  0
  • Muhammad Hasan Khan  · 技术社区  · 16 年前

    所以我的问题是在什么情况下锁(syncObject)会抛出异常?

    • syncObject不为空
    • syncObject尚未锁定

    1 回复  |  直到 16 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    从…起 this page :

    每次锁获取都可能引发异常。做好准备。

    如果锁获取遇到争用,大多数锁会延迟分配事件,包括CLR监视器。在资源不足的情况下,此分配可能会失败,从而导致从锁入口发出的OOM。(请注意,典型的非阻塞自旋锁不能在OOM中失败,这允许它在某些资源受限的场景中使用,例如在CER中。)类似地,像SQL Server这样的主机可以执行死锁检测,甚至可以通过生成源自Enter语句的异常来打破这些死锁,显示为System.Runtime.InteropServices.COMException。

    {
        uint iters = 0;
        while (!cond) {
            if ((++iters % 50) == 0) {
                // Every so often we sleep with a 1ms timeout (see #30 for justification).
                Thread.Sleep(1);
            } else if (Environment.ProcessorCount == 1) {
                // On a single-CPU machine we yield the thread.
                Thread.Sleep(0);
            } else {
                // Issue YIELD instructions to let the other hardware thread move.
                Thread.SpinWait(25);
            }
        }
    }
    

    康德可能在哪里

    private volatile int cond = 0
    

    与Interlocked.CompareExchange一起使用,其中更改为Thread.Current.ManagedThreadID或其他非零?