我有许多调用常用函数的工作线程。我按如下方式使用锁定对象:
static object var mylock = new object();
public void myFunction()
{
if (Monitor.TryEnter(mylock, 0))
{
try
{
// Do work
}
finally
{
Monitor.Exit(mylock);
}
}
}
但是,在进入myFunction之前,我想知道对象是否已锁定,以便我可以做其他事情。所以我做了:
public bool IsLocked
{
get { return !Monitor.TryEnter(locker); }
}
这会起作用,还是锁定对象?
答案 0 :(得分:0)
如果对象未锁定,它将锁定对象,并且在您调用exit之前不会释放锁定。如果锁已被另一个线程占用,则它不会获取锁,但如果您在首先获得锁的线程上进行调用,则TryEnter
将成功。
要解决此问题,您可以使用标志和互锁功能:
object var mylock = new object();
long isLocked;
public void myFunction()
{
if (Monitor.TryEnter(mylock, 0))
{
Interlocked.Exchange(ref isLocked, 1);
try
{
// Do work
}
finally
{
Interlocked.Exchange(ref isLocked, 0);
Monitor.Exit(mylock);
}
}
}
public bool IsLocked
{
get { return Interlocked.Read(ref isLocked)==0; }
}