【问题标题】:SynchronizationLockException (Object synchronization method was called from an unsynchronized block of code.) when releasing a lockSynchronizationLockException(对象同步方法是从未同步的代码块中调用的。)释放锁时
【发布时间】:2012-12-09 04:28:51
【问题描述】:

释放锁时,我收到了 SynchronizationLockException。

当然,我做的第一件事就是在 Google 上搜索这个问题。我发现了两个主要的错误模式:

  1. 在与创建的线程不同的线程上释放 Mutex。
  2. 使用值类型作为监视器的同步对象。要么 在进入和退出之间修改同步对象 监控。

问题是这些模式都不适合我的情况。

我有一个非常简单的同步场景:

public class MyClass : IDisposable
{
    private readonly object _myLock = new object();

    internal void Func1()
    {
        lock (_myLock)
        {
            //Some code here
        }
    }

    internal void Func2()
    {
        lock (_myLock)
        {
            //Some code here
        }
    }

    public void Dispose()
    {
        lock (_myLock)
        {
            //Some code here
        }  // Here is where I get an exception
    }
}

最终我在Dispose() 的行上收到SynchronizationLockException,锁被释放。

我的问题不是“我的代码有什么问题”或“我做错了什么”。基本上,我想知道 .NET 的 lock 实现如何(以及在​​何种情况下)抛出此异常。

谢谢。

【问题讨论】:

  • 非托管代码导致的堆损坏总是有可能发生的。您的问题中没有任何内容表明这很可能。
  • 对象同步方法是从未同步的代码块中调用的。在 MyClass.Dispose() 在 CleanupForm.OnBtnRemoveClick(Object sender, EventArgs e) 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) ... 在系统.Windows.Forms.ButtonBase.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow .Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

标签: c# multithreading synchronization locking


【解决方案1】:

当 List 实例调整其基础数组的大小以适应新元素时,我曾经在 List 实例中遇到过 SynchronizationLockException。 List 实例已从三个不同的线程访问,并且缺少一个锁...

我会说:三重检查您是否以正确的方式进行线程同步。

此外,以正确的方式实现 IDisposable 模式(请参阅http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx)。也许终结器让你头疼。

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 2015-02-06
    • 1970-01-01
    • 2012-09-14
    • 2012-02-19
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多