gpt4 book ai didi

c# - 是否可以在 C# 中实现作用域锁?

转载 作者:太空狗 更新时间:2023-10-29 22:04:40 25 4
gpt4 key购买 nike

C++ 中的一个常见模式是创建一个包装锁的类 - 锁要么在创建对象时隐式获取,要么在之后显式获取。当对象超出范围时,dtor 会自动释放锁。是否可以在 C# 中执行此操作?据我所知,无法保证 C# 中的 dtor 在对象超出范围后何时运行。

澄清:一般的任何锁,自旋锁,ReaderWriterLock,等等。自己调用 Dispose 违背了模式的目的——一旦我们退出作用域就释放锁——不管我们是否在中间调用 return,抛出异常或诸如此类的东西。另外,据我所知,使用仍然只会为 GC 排队对象,而不是立即销毁它......

最佳答案

为了加强 Timothy 的回答,lock 语句确实使用监视器创建了作用域锁。本质上,这转化为这样的东西:

lock(_lockKey)
{
// Code under lock
}

// is equivalent to this
Monitor.Enter(_lockKey)
try
{
// Code under lock
}
finally
{
Monitor.Exit(_lockKey)
}

在 C# 中,您很少将 dtor 用于这种模式(请参阅 using 语句/IDisposable)。您可能在代码中注意到的一件事是,如果在 Monitor.Enter 和 try 之间发生异步异常,看起来监视器将不会被释放。 JIT 实际上做了一个特殊的保证,如果 Monitor.Enter 紧接在 try block 之前,异步异常将不会发生,直到 try block 从而确保释放。

关于c# - 是否可以在 C# 中实现作用域锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com