【问题标题】:Mutex allowing more than one thread to pass允许多个线程通过的互斥锁
【发布时间】:2019-03-13 14:56:49
【问题描述】:

我的代码似乎允许多个线程进入受互斥锁“保护”的特定方法。

private static Mutex mut = new Mutex();
    public DadoMySql PegaPrimeiroFila(int identificacao)
    {
        DadoMySql dadoMySql = null;
        mut.WaitOne();


        dadoMySql = PegaPrimeiroFila_Processa();


        mut.ReleaseMutex();

        return dadoMySql;
    }

我有 10 个线程,并且不断获得 2 个随机线程,而不是每次都获得相同的“dadoMySql”。

如果我在 de mutex 中添加日志,则一切正常。编写日志所需的额外时间使它工作:/,也许?

【问题讨论】:

  • 你有什么证据让你认为两个或多个线程同时“拥有”了互斥锁?听起来当您尝试通过日志记录来证明这一点时,日志记录证明与您的假设相反。我们不知道您看到了什么行为,但该行为是否有其他解释?

标签: c# multithreading mutex


【解决方案1】:

Mutex 在这里太过分了,除非您要跨多个进程进行同步。

一个简单的锁应该可以工作,因为你想要互斥:

private static readonly object lockObject = new object();

public DadoMySql PegaPrimeiroFila(int identificacao)
{
    DadoMySql dadoMySql = null;
    lock (lockObject)
    {
        dadoMySql = PegaPrimeiroFila_Processa();
    }
    return dadoMySql;
}

使用lock 关键字还可以更强有力地保证Monitor.Exit 几乎总是被调用。一个很好的例子是在lock 范围内引发异常。

【讨论】:

  • 只是好奇。我看你写的是“更强的保证”,怎么会呢?如果出现OutOfMemoryException,它不会释放它?
  • @Neijwiert 请参阅documentation。简而言之,它使用try ... finally。
  • 是的,我知道这一点。但是,与“保证”相比,“更强有力的保证”如何?
  • 我的意思是,这绝对是比不尝试使用try()...finally()的提问者代码更强的保证
  • @Neijwiert 因为finally 不能 100% 保证运行。一个例子here.
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多