C++11的shared_ptr有可能导致函数调用栈溢出

在使用C++11的shared_ptr实现lock free版本的栈数据结构时,如果线程调度不当,可能导致旧节点的析构函数递归调用过深,从而引起调用栈溢出。文章通过并发测试例子说明了这个问题,并强调在设计时必须注意避免此类情况发生。
摘要由CSDN通过智能技术生成

最开始关注这个问题是在测试C++ Concurrency in Action这本书提及的几个版本stack数据结构的实现,其中lock free版本的实现时,需要精巧的内存回收机制,其中在介绍count reference内存回收机制时,作者认为shared_ptr是有reference count的指针,如果某个平台支持lock free版本的shared_ptr,可以使用它来简化count reference内存回收方式的实现。

但是我想指出的是,这个实现方式,有可能导致调用栈溢出,我当时使用4个线程向stack中push数据,4个线程从stack中pop数据,每个线程操作100万个数据,就会偶尔出现调用栈溢出的问题。

使用shared_ptr使用的lock free版本的stack代码大概如下

template<typename T>
class lock_free_stack
{
    private:
        struct node
        {
            unique_ptr<T> data;
            shared_ptr<node> next;
            node(const T &v) : data(new T) {}
        }
        shared_ptr<node> head;
    public:
        void push(const T &v)
        {
            auto new_node = make_shared<node>(v);
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值