互斥,如何使用 Lamport 的 Bakery 算法实现 try_lock() 方法?
Mutual exclusions, How to implement try_lock() method using Lamport's Bakery Algorithm?
我正在尝试使用 Lamport 的烘焙算法和 C++ 中的 Lockable 概念创建 BakeryLock 抽象。实现 lock()、unlock() 方法非常容易。有人可以帮我实现 try_lock() 方法吗?
来自文档:
m.try_lock()
效果:尝试在不阻塞的情况下为当前执行代理获取锁。如果抛出异常,则不应为当前执行代理获取锁。
Return 类型:bool
Returns: 如果获得锁则为真,否则为假。
我在 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;
}
我正在尝试使用 Lamport 的烘焙算法和 C++ 中的 Lockable 概念创建 BakeryLock 抽象。实现 lock()、unlock() 方法非常容易。有人可以帮我实现 try_lock() 方法吗?
m.try_lock()
效果:尝试在不阻塞的情况下为当前执行代理获取锁。如果抛出异常,则不应为当前执行代理获取锁。
Return 类型:bool
Returns: 如果获得锁则为真,否则为假。
我在 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;
}