Manually incrementing and decrementing a boost::shared_ptr?

前端 未结 7 1478
后悔当初
后悔当初 2021-01-05 22:57

Is there a way to manually increment and decrement the count of a shared_ptr in C++?

The problem that I am trying to solve is as follows. I am writing a library in C

7条回答
  •  佛祖请我去吃肉
    2021-01-05 23:34

    fastest possible concurrent lockless manager (if you know what you are doing).

    template< class T >
    class shared_pool
    {
    public:
    
        typedef T value_type;
        typedef shared_ptr< value_type > value_ptr;
        typedef value_ptr* lock_handle;
    
    shared_pool( size_t maxSize ):
        _poolStore( maxSize )
    {}
    
    // returns nullptr if there is no place in vector, which cannot be resized without locking due to concurrency
    lock_handle try_acquire( const value_ptr& lockPtr ) {
        static value_ptr nullPtr( nullptr );
        for( auto& poolItem: _poolStore ) {
            if( std::atomic_compare_exchange_strong( &poolItem, &nullPtr, lockPtr ) ) {             
                return &poolItem;
            }
        }
        return nullptr;
    }
    
    
    lock_handle acquire( const value_ptr& lockPtr ) {
        lock_handle outID;
        while( ( outID = try_acquire( lockPtr ) ) == nullptr ) {
            mt::sheduler::yield_passive(); // ::SleepEx( 1, false );
        }
        return outID;
    }
    
    value_ptr release( const lock_handle& lockID ) {
        value_ptr lockPtr( nullptr );
        std::swap( *lockID, lockPtr);
        return lockPtr;
    }
    
    protected:
    
        vector< value_ptr > _poolStore;
    
    };
    

    std::map is not so fast, requires additional search, extra memory, spin-locking. But it grants extra safety with handles approach.

    BTW, hack with manual release/acquire seems to be a much better approach (in terms of speed and memory usage). C++ std better add such a functionality in their classes, just to keep C++ razor-shaped.

提交回复
热议问题