前言
前面的自旋锁可以实现非阻塞数据结构,自旋锁的优点就是在于线程一直处于执行状态,而且线程不需要唤醒,执行效率较高。但是会一直占用CPU资源,导致资源的浪费。但是还有一种无锁数据结构是,是可以实现多于一个线程的并发地访问此数据结构。
无锁数据结构的优点与缺点
- 可以实现最大程度的并发,有可能一个线程必须阻塞,并可以继续前等待另一个线程完成其操作;
- 强健壮性,当一个线程在持有锁的时候终止,那么这个数据结构将会被永久破坏,但是无锁数据结构终止时,就不会丢失任何数据。
实例
template<typename T>
class lock_free_stack {
private:
struct node
{
T data;
node* next;
node(T const& data_) :
data(data_) {
}
};
std::atomic<node*> head;
public:
void push<