gpt4 book ai didi

c# - 关于使用 Monitor.TryEnter 和锁定对象的问题

转载 作者:可可西里 更新时间:2023-11-01 08:02:30 27 4
gpt4 key购买 nike

考虑以下实现仅对一个线程的非阻塞访问的函数。

public bool TryCancelGroup()
{
if (Monitor.TryEnter(_locked))
{
if (_locked == false)
{
_locked = true;

try
{
// do something
}
catch (Exception ex)
{
_locked = false;
}
finally
{
Monitor.Exit(_locked);
}
}
return _locked;
}
else
{
return false;
}
}

下面是 _locked 变量的定义方式。

bool _locked = false;

现在,当程序到达 Monitor.Exit(_locked); 时,它会抛出一个 System.Threading.SynchronizationLockException,说明 _locked 变量之前未同步。

在 _locked 变量被定义为对象之前一切正常

object _locked = new object();

当我将它更改为 bool 以便将其用作 bool 标志时,我开始遇到此异常。

最佳答案

原因是 Monitor 方法都带有一个 System.Object 参数。当您传入 bool 时,需要将一个框转换为 Object。框操作为每次调用生成一个新的 System.Object 值。因此 TryEnterExit 方法会看到不同的对象并导致异常。

_locked 被输入到 Object 时,就不需要盒子了。因此 TryEnterExit 方法看到相同的对象并且可以正常运行。

关于代码的一些其他评论

  • 在所有情况下,TryEnter 都必须与 Exit 配对,并且为了理智起见,Exit 调用应该在 finally block 中。否则你会陷入僵局
  • _locked 变量仅在遇到异常时才设置为 false。如果执行没有产生异常,它将保持为真,并且没有线程会再次进入 if block 。

关于c# - 关于使用 Monitor.TryEnter 和锁定对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564320/

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