
无锁算法(Lock-Free Algorithm)是一种在多线程编程中避免使用传统互斥锁(如mutex)的并发编程方法。它通过原子操作和内存屏障等技术保证线程安全,具有以下特点:
典型应用场景包括:
CAS是Compare-And-Swap的缩写,是一种重要的原子操作指令,其伪代码如下:
bool CAS(T* ptr, T oldVal, T newVal) {
if (*ptr == oldVal) {
*ptr = newVal;
return true;
}
return false;
}CAS操作包含三个参数:
现代处理器通常通过以下方式提供CAS支持:
CMPXCHG指令
CMPXCHGCMPXCHG8B/CMPXCHG16BLDREX/STREX指令对
lwarx/stwcx指令对
各编程语言对CAS的封装:
std::atomic及其compare_exchange_weak/strong方法AtomicInteger等原子类的compareAndSet方法Interlocked.CompareExchange方法ABA问题是指:
这种情况可能导致逻辑错误,特别是在涉及指针操作时。
AtomicStampedReferencetemplate<typename T>
class LockFreeStack {
struct Node {
T data;
Node* next;
};
std::atomic<Node*> head;
public:
void push(const T& data) {
Node* newNode = new Node{data, nullptr};
newNode->next = head.load();
while(!head.compare_exchange_weak(newNode->next, newNode)) {
// CAS失败,重试
}
}
bool pop(T& result) {
Node* oldHead = head.load();
while(oldHead &&
!head.compare_exchange_weak(oldHead, oldHead->next)) {
// CAS失败,重试
}
if(!oldHead) return false;
result = oldHead->data;
delete oldHead;
return true;
}
};优化策略: