c++ - 互斥,如何使用 Lamport 的烘焙算法实现 try_lock() 方法?
问题描述
我正在尝试使用 Lamport 的面包店算法和 C++ 中的可锁定概念创建一个 BakeryLock 抽象。实现 lock()、unlock() 方法非常容易。有人可以帮我实现 try_lock() 方法吗? 从文档:
m.try_lock()
效果:尝试获取当前执行代理的锁而不阻塞。如果抛出异常,则不应为当前执行代理获取锁。
返回类型:布尔
返回:如果获得了锁,则返回 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;
}
推荐阅读
- java - 连接到不在活动类中的 google fit android API
- ios - 是什么导致 UIPageViewController 中的内存泄漏?
- c - unsigned char 的大小是 8 位,但为什么我可以将它(左或右)移动或最多 31 位?
- django - 在 Ubuntu 中使用 nginx 和 uwsgi 运行 Django 的问题
- java - Java中的链式构造函数
- javascript - RangeError:无效的数组长度
- flightphp - 没有在端点上收到航班警报
- sql - ORA-03001: 未实现的功能
- json - 通过 API 传输更大文件的文件
- nginx - Redis 和 Lua 中的连接