我正在尝试使用Lamport的面包店算法和C ++中的Lockable概念创建BakeryLock抽象。实现lock(),unlock()方法非常容易。有人可以帮我实现try_lock()方法吗? 来自文档:
m.try_lock()
效果:尝试获取当前执行代理的锁而不会阻塞。如果抛出异常,则不应为当前执行代理获取锁定。
返回类型:bool
返回:如果获得了锁,则返回true,否则返回false。
我用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;
}