互斥,如何使用Lamport的Bakery算法实现try_lock()方法?

我正在尝试使用Lamport的面包店算法和C ++中的Lockable概念创建BakeryLock抽象。实现lock(),unlock()方法非常容易。有人可以帮我实现try_lock()方法吗?

互斥,如何使用Lamport的Bakery算法实现try_lock()方法?

来自文档:

m.try_lock()

效果:尝试获取当前执行代理的锁而不会阻塞。如果抛出异常,则不应为当前执行代理获取锁定。

返回类型:bool

返回:如果获得了锁,则返回true,否则返回false。

bluemoon88888 回答:互斥,如何使用Lamport的Bakery算法实现try_lock()方法?

我用C ++提出了以下解决方案,但尚未对其进行全面测试。

bool ImprovedBakeryLock::try_lock(int i)
{
    Entering[i] = true;
    Number[i] = 1 + max(Number[1],...,Number[NUM_THREADS]);
    Entering[i] = false;
    bool acquired = true;
    for (int j = 1; j <= NUM_THREADS && acquired; ++j) {
        if (Number[j] != 0 && Number[j] < Number[i]){
            acquired = false;
            Number[i] = 0;
        }
    }
    return acquired;
}
本文链接:https://www.f2er.com/3108114.html

大家都在问