【发布时间】:2012-12-09 04:28:51
【问题描述】:
释放锁时,我收到了 SynchronizationLockException。
当然,我做的第一件事就是在 Google 上搜索这个问题。我发现了两个主要的错误模式:
- 在与创建的线程不同的线程上释放 Mutex。
- 使用值类型作为监视器的同步对象。要么 在进入和退出之间修改同步对象 监控。
问题是这些模式都不适合我的情况。
我有一个非常简单的同步场景:
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