C++中的一个常见模式是创建一个包装锁的类 - 在创建对象时隐式获取锁,或者在之后显式获取锁.当对象超出范围时,dtor会自动释放锁定.是否可以在C#中执行此操作?据我所知,无法保证C#中的dtor何时在对象超出范围后运行.
澄清:一般锁定,自旋锁,ReaderWriterLock,等等.调用Dispose会破坏模式的目的 - 一旦我们退出范围就释放锁 - 无论我们是否在中间调用return,抛出异常或诸如此类的东西.另外,据我所知,使用仍然只会为GC排队对象,而不是立即销毁它...
den*_*ips 12
为了放大Timothy的答案,lock语句确实使用监视器创建了一个范围锁.从本质上讲,这转化为这样的事情:
lock(_lockKey)
{
// Code under lock
}
// is equivalent to this
Monitor.Enter(_lockKey)
try
{
// Code under lock
}
finally
{
Monitor.Exit(_lockKey)
}
Run Code Online (Sandbox Code Playgroud)
在C#中,很少使用dtor作为这种模式(请参阅using语句/ IDisposable).您可能在代码中注意到的一件事是,如果在Monitor.Enter和try之间发生异步异常,则看起来监视器不会被释放.JIT实际上特别保证,如果Monitor.Enter紧接在try块之前,则在try块之前不会发生异步异常,从而确保释放.
| 归档时间: |
|
| 查看次数: |
5275 次 |
| 最近记录: |