java 无锁栈_无锁栈的实现

template

classLockFreeStack

{private:structNode;structCountedNode

{int externalCount = 0;

Node* ptr =nullptr;

};structNode

{

std::shared_ptrdata;

std::atomicinternalCount;

CountedNode next;

Node(Tconst&data_):

data(std::make_shared(data_)),

internalCount(0)

{}

};

std::atomichead;void increaseHeadCount(CountedNode&oldCounter)

{

CountedNode newCounter;do{

newCounter=oldCounter;++newCounter.externalCount;

}while (!head.compare_exchange_strong(oldCounter, newCounter,

std::memory_order_acquire,

std::memory_order_relaxed));

oldCounter.externalCount=newCounter.externalCount;

}public:~LockFreeStack()

{while(pop() !=nullptr);

}void push(T const&data)

{

CountedNode newNode;

newNode.ptr= newNode(data);

newNode.externalCount= 1;

newNode.ptr->next =head.load(std::memory_order_relaxed);while(!head.compare_exchange_weak(newNode.ptr->next, newNode,

std::memory_order_release,

std::memory_order_relaxed));

}

std::shared_ptrpop()

{

auto oldHead=head.load(std::memory_order_relaxed);for(;;){

increaseHeadCount(oldHead);

autoconst nodePtr =oldHead.ptr;if (nodePtr ==nullptr){return shared_ptr();

}if (head.compare_exchange_strong(oldHead, nodePtr->next,

std::memory_order_relaxed)){

std::shared_ptrresult;

result.swap(nodePtr->data);int const increaseCount = oldHead.externalCount - 2;if (nodePtr->internalCount.fetch_add(increaseCount,

std::memory_order_release)== -increaseCount){deletenodePtr;

}returnresult;

}else if (nodePtr->internalCount.fetch_add(-1,

std::memory_order_acquire)== 1){

nodePtr->internalCount.load(std::memory_order_acquire);deletenodePtr;

}

}

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值