1

我有两个函数 A 和 B,我想防止它们同时运行。我应该使用锁或互斥锁还是互锁?

这是我尝试过的:

class C
{
    object obj = new Object();

    void A()
    {
        lock(obj)
        {
            // do stuff
        }
    }

    void B()
    {
        lock(obj)
        {
            // do stuff
        }
    }
}

如果我想让 A 检查 B 是否被锁定并返回,我将如何处理?

有更好的解决方案吗?

4

1 回答 1

3

您拥有的代码已经阻止了两个不同的线程同时调用Aand B(在同一实例上C)-尽管请注意,如果A调用B(或B调用A)它将起作用。调用将被阻止,直到它可以获取lock.

如果您想检查是否可以获得lock, 而不阻塞 - 您可以通过TryEnter指定零超时来做到这一点:

bool lockTaken = false;
try {
    Monitor.TryEnter(obj, 0, ref lockTaken);
    if(lockTaken) {
        // have lock etc
    }
} finally {
    if(lockTaken) Monitor.Exit(obj);
}
于 2013-05-23T09:06:43.510 回答