gpt4 book ai didi

c# - lock 和 monitor 可以安全地用在同一个对象上吗?

转载 作者:太空狗 更新时间:2023-10-29 20:03:13 24 4
gpt4 key购买 nike

我有以下情况:我想相互排除对对象的访问。

到目前为止,我通常会使用锁对象

object lockObject = new object();
...

method1: lock(lockObject) { CODE1 }

现在我还有一个可以从另一个线程调用的方法。它不应该被阻塞未知的时间,而是应该在规定的时间内给出答案。

在这种情况下,我会使用监视器,例如

method2:
try{
Monitor.TryEnter(lockObject , 20000, ref lockTaken);
if (lockTaken) {CODE2}
}
catch(...){...}
finally
{
if (lockTaken) Monitor.Exit(timerLock);
}

现在我的问题是:如果锁对象相同且互斥,是否可以将锁和监视器混合使用,或者是否需要将每个锁都更改为监视器。

那么两次相同的 token 是否会被“锁定”,或者监视器是否会为对象创建另一个 token 然后锁定?

乍看之下,我看不到应用程序同时在两者的代码中运行。但我不知道是否存在任何时序问题,其中 CODE1 和 CODE2 是并行执行的。

最佳答案

can lock and monitor be mixed in such a way if the lockobject is the same and mutually exclude each other

是的,那是完全安全的,而且会起作用。

lock { } 语句被重写为对 Monitor.Enter() 和 Monitor.Exit() 的调用。它只是简写形式,与 using() {} 语句非常相似。

来自 MSDN :

 lock (x) ...

成为

System.Threading.Monitor.Enter(x);
try {
...
}
finally {
System.Threading.Monitor.Exit(x);
}

根据评论,在 Fx4 及更高版本中它可以使用 Monitor.TryEnter() 。但是上面的简单版本回答了你的问题。

关于c# - lock 和 monitor 可以安全地用在同一个对象上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14377366/

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