gpt4 book ai didi

C# 如何检测一个对象是否已经被锁定

转载 作者:IT王子 更新时间:2023-10-29 04:09:18 26 4
gpt4 key购买 nike

如何检测对象是否被锁定?

Monitor.TryEnter(如 Is there a way to detect if an object is locked? 中所述)对我不起作用,因为它会锁定未锁定的对象。

想检查它是否被锁定,在我的代码中的其他地方我将使用Monitor 类来锁定对象。

我知道可以使用 bool 字段(例如 private bool ObjectIsLocked),但是使用锁定对象本身可以检测到什么。

下面的示例代码显示了我想要做什么:

private static object myLockObject = new object();

private void SampleMethod()
{
if(myLockObject /*is not locked*/) // First check without locking it
{
...
// The object will be locked some later in the code
if(!Monitor.TryEnter(myLockObject)) return;

try
{

....
}
catch(){...}
finally
{
Monitor.Exit(myLockObject);
}
}
}

最佳答案

你做错了。如果您没有对象上的锁,则无法检查它是否被锁定(如果您有锁,您会提前知道)。你可以“问”“被锁了吗?”并得到一个“不”作为响应,然后在下一个纳秒另一个线程可以获取锁并且您的程序将进入损坏状态。这根本不是继续多线程应用程序的方式,也是 .NET 没有 Monitor.IsLocked 方法的原因。如果您的代码需要在获取锁之前检查锁,那么您就遇到了设计问题。尝试使用不 protected 标志来解决它是一个糟糕的解决方案,保证 100% 的机会不会起作用。

无论如何,不​​要使用 bool var 来表示多线程 已锁定 状态(因为您可能会遇到同样的问题,您会读到“false”和 1 纳秒稍后另一个线程将向其写入“true”)。使用 Interlock.CompareExchange

private static int _lockFlag = 0; // 0 - free

if (Interlocked.CompareExchange(ref _lockFlag, 1, 0) == 0){
// only 1 thread will enter here without locking the object/put the
// other threads to sleep.

Monitor.Enter(yourLockObject);

// free the lock.
Interlocked.Decrement(ref _lockFlag);
}

您会看到您需要在每个 可以获取对象锁的地方更改_lockFlag。换句话说,您将围绕 native 构建一个自定义锁系统。

关于C# 如何检测一个对象是否已经被锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12033725/

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