【问题标题】:SynchronizationLockException using mutexes使用互斥锁的 SynchronizationLockException
【发布时间】:2015-07-02 17:07:56
【问题描述】:

我在尝试调用 Monitor.Wait(object) 时在互斥锁内收到 SynchronizationLockException。我应该改变什么?

static Mutex mutex;
static readonly object monitorKey;
condition = true;
mutex.WaitOne();
        try
        {
            while (condition)  
            {
                Monitor.Wait(monitorKey); // exception is thrown
            }
            isAnyoneWriting = true;         
        }
        finally
        {
            mutex.ReleaseMutex();
        }

【问题讨论】:

    标签: c# multithreading parallel-processing


    【解决方案1】:

    您需要在创建时为 monitorKey 分配一个值 (new object();)(因为它是静态且只读的)。

    之后,你必须在等待之前获得锁:

    while (condition)
    {
       lock(monitorKey)
       {
          Monitor.Wait(monitorKey); // exception is thrown
       }
    }
    

    或者您可以颠倒顺序并让锁包围 while 以避免不必要的锁 -> 退出循环。

    【讨论】:

    • 对不起,我忘记了分配,因为我在构造函数中有它们。你知道为什么在这种情况下互斥锁不能用作锁吗?
    • 如果您在构造函数中为monitorKey 赋值,那很好。关于互斥体,这与问题或解决方案无关。正如我所写,您必须在等待锁之前获取锁。这意味着锁定您计划等待的对象。这就是 API 的定义方式。
    • 非常感谢,你把我从灾难中救了出来;]
    • 锁包围一切不是一个好的设计,会导致线程之间的大量争用,只需锁定修改/写入不安全结构的所需部分
    • @MrinalKamboj - 这通常是 Monitor.Wait 函数的用途。您在等待期间释放锁。我只是注意到,在 while 之外进行锁定可能是有意义的,因为那里没有其他“工作”正在完成。
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2012-06-05
    • 2010-09-16
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多