c# - 监控与锁定

标签 c# .net multithreading locking monitor

在 C# 中什么时候使用 Monitor 类或 lock 关键字来保证线程安全?

编辑: 从目前的答案看来,lock 是对 Monitor 类的一系列调用的简写。 lock call 的简写到底是什么?或者更明确地说,

class LockVsMonitor
{
    private readonly object LockObject = new object();
    public void DoThreadSafeSomethingWithLock(Action action)
    {
        lock (LockObject)
        {
            action.Invoke();
        }
    }
    public void DoThreadSafeSomethingWithMonitor(Action action)
    {
        // What goes here ?
    }
}

更新

谢谢大家的帮助:我已经发布了另一个问题作为对你们提供的一些信息的跟进。由于您似乎精通该领域,因此我发布了链接:What is wrong with this solution to locking and managing locked exceptions?

最佳答案

Eric Lippert 在他的博客中谈到了这一点: Locks and exceptions do not mix

等效代码在 C# 4.0 和更早版本之间有所不同。


在 C# 4.0 中是:

bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    { body }
}
finally
{
    if (lockWasTaken) Monitor.Exit(temp);
}

它依赖于 Monitor.Enter 在获取锁时自动设置标志。


早些时候是:

var temp = obj;
Monitor.Enter(temp);
try
{
   body
}
finally
{
    Monitor.Exit(temp);
}

这依赖于 Monitor.Entertry 之间没有抛出异常。我认为在调试代码中违反了这个条件,因为编译器在它们之间插入了一个 NOP,从而使它们之间的线程中止成为可能。

关于c# - 监控与锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4978850/

相关文章:

C# - FieldInfo 和 PropertyInfo 是不可变的还是可变的?

.net - 更改连接字符串 .NET Oracle 错误

c# - 如何在不将页面加载到浏览器的情况下刷新页面?

python - 了解 Pool 中已完成多少任务

c# - 如何用异步调用的结果来补充字典?

c# - XmlSerializer 不反序列化 DateTime

c# - 帮助计算一组可能的组合以构成总数的数学/编码 - C#

c# - UWP 用户控件依赖属性不起作用

c++ - 多线程可能会抑制编译器优化吗?

c - 此解决方案中的信号量使用是否正确?