以下是一个简单的C++ MCS锁的示例代码:
#include <atomic>
struct QNode {
std::atomic<bool> locked{false};
std::atomic<QNode*> next{nullptr};
};
class MCSLock {
public:
void lock(QNode* node) {
QNode* prev = tail.exchange(node, std::memory_order_acquire);
if (prev != nullptr) {
node->locked.store(true, std::memory_order_relaxed);
prev->next.store(node, std::memory_order_release);
while (node->locked.load(std::memory_order_acquire)) {}
}
}
void unlock(QNode* node) {
if (node->next.load(std::memory_order_relaxed) == nullptr) {
if (tail.compare_exchange_strong(node, nullptr, std::memory_order_release)) {
return;
}
while (node->next.load(std::memory_order_relaxed) == nullptr) {}
}
node->next.load()->locked.store(false, std::memory_order_release);
}
private:
std::atomic<QNode*> tail{nullptr};
};
在这个示例中,QNode 是每个线程持有的节点结构,其中包含了 locked 表示该线程是否已经获取了锁,以及 next 指向下一个等待锁的节点。MCSLock 类实现了 MCS 锁的 lock() 和 unlock() 方法。
使用时,可以创建多个 QNode 对象作为每个线程的节点,并调用 lock() 和 unlock() 方法来获取和释放锁。
请注意,这只是一个简化的示例代码,并未考虑一些高级的情况和优化,实际使用时还需要根据具体需求进行修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问




