允许多个线程通过的互斥量
Mutex allowing more than one thread to pass
我的代码似乎允许多个线程通过互斥体进入特定方法"protected"。
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 wait 中添加日志,一切正常。写入日志所花费的额外时间使其工作:/,也许吧?
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
范围内抛出异常。
我的代码似乎允许多个线程通过互斥体进入特定方法"protected"。
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 wait 中添加日志,一切正常。写入日志所花费的额外时间使其工作:/,也许吧?
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
范围内抛出异常。