c++新特性11 (10)shared_ptr二”_Ref_count_base类“

. 保证线程安全
. 析构时如果计数器为0,删除自身
. 有两个计数器变量:一个供shared指针用,一个供weak指针用

// CLASS _Ref_count_base
class __declspec(novtable) _Ref_count_base {
    
     // common code for reference counting
private:

    _Atomic_counter_t _Uses  = 1;
    _Atomic_counter_t _Weaks = 1;

protected:
    constexpr _Ref_count_base() noexcept = default; // non-atomic initializations

public:
    _Ref_count_base(const _Ref_count_base&) = delete;
    _Ref_count_base& operator=(const _Ref_count_base&) = delete;


    bool _Incref_nz() noexcept {
    
     // increment use count if not zero, return true if successful
        auto& _Volatile_uses = reinterpret_cast<volatile long&>(_Uses);
#ifdef _M_CEE_PURE
        long _Count = *_Atomic_address_as<const long>(&_Volatile_uses);
#else
        long _Count = __iso_volatile_load32(reinterpret_cast<volatile int*>(&_Volatile_uses));
#endif
        while (_Count != 0) {
    
    
            const long _Old_value = _INTRIN_RELAXED(_InterlockedCompareExchange)(&_Volatile_uses, _Count + 1, _Count);
            if (_Old_value == _Count) {
    
    
                return true;
            }

            _Count = _Old_value;
        }

        return false;
    }

    void _Incref() noexcept {
    
     // increment use count
        _MT_INCR(_Uses);
    }

    void _Incwref() noexcept {
    
     // increment weak reference count
        _MT_INCR(_Weaks);
    }

    void _Decref() noexcept {
    
     // decrement use count
        if (_MT_DECR(_Uses) == 0) {
    
    
            _Destroy();
            _Decwref();
        }
    }

    void _Decwref() noexcept {
    
     // decrement weak reference count
        if (_MT_DECR(_Weaks) == 0) {
    
    
            _Delete_this();
        }
    }

    long _Use_count() const noexcept {
    
    
        return static_cast<long>(_Uses);
    }

    virtual void* _Get_deleter(const type_info&) const noexcept {
    
    
        return nullptr;
    }
}

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/123887045