gpt4 book ai didi

c# - Monitor.TryEnter(lockObject, timeout) 重载不安全吗? (。网)

转载 作者:行者123 更新时间:2023-11-30 14:28:42 29 4
gpt4 key购买 nike

我在代码审查期间被建议去做

bool acquiredLock = false;
try {
Monitor.TryEnter(lockObject, 500, ref acquiredLock);
if (acquiredLock) {
// do something
}
else {
// fallback strategy
}
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}

而不是更简单

if (Monitor.TryEnter(lockObject, 500)) {
try {
// do something...
}
finally {
Monitor.Exit(lockObject);
}
} else {
// fallback strategy
}

这有什么区别?为什么第一个代码出现错误而第二个代码会出现错误?

最佳答案

假设在您的第二个代码段中您实际上调用了Monitor.Exit,差异在the documentation 中进行了解释。 :

This overload always sets the value of the variable that is passed to the ref parameter lockTaken, even if the method throws an exception, so the value of the variable is a reliable way to test whether the lock has to be released.

换句话说,对于您的第二个代码段,在获取锁之后但在方法返回之前抛出异步异常(例如线程被中止)可能是可行的。即使使用 finally block ,您也无法轻松判断是否需要释放锁。使用 ref 参数,“获取监视器”和“ref 参数设置为 true”操作是原子的 - 变量不可能具有方法退出时的错误值,但是它退出了。

从 C# 4 开始,当以支持此重载的平台为目标时,这也是 C# 编译器生成的代码。

关于c# - Monitor.TryEnter(lockObject, timeout) 重载不安全吗? (。网),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28703627/

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