互斥,如何使用Lamport的面包店算法来实现try_lock()方法?

问题描述 投票:0回答:1

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

m.try_lock()

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

返回类型:布尔

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

c++ concurrency mutex mutual-exclusion
1个回答
0
投票

我用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.