如何使用锁同步两个函数

本文关键字:两个 函数 何使用 同步 | 更新日期: 2023-09-27 18:15:10

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

这是我尝试过的:

class C
{
    object obj = new Object();
    void A()
    {
        lock(obj)
        {
            // do stuff
        }
    }
    void B()
    {
        lock(obj)
        {
            // do stuff
        }
    }
}

如果我想让A检查B是否被锁定并返回我该怎么做呢?

有更好的解决方案吗?

如何使用锁同步两个函数

您拥有的代码将防止两个不同的线程同时调用AB(在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);
}