atomic operations for shared_ptr ?

Oleg Endo oleg.endo@t-online.de
Sun Aug 25 18:47:00 GMT 2013


On Sat, 2013-08-24 at 21:27 +0100, Bronek Kozicki wrote:
> Here is example naiive implementation with a spinlock pool. Even though 
> far from perfect, I feel it would be improvement over existing 
> siutuation, provided large enough pool.
> 
> 
> B.
> 
> 
> extern const size_t __shared_ptr_spinlocks_size = 256;
> extern std::atomic_flag* __shared_ptr_spinlocks; // definition omitted
> 
> // platform dependent, drop least significant bits from a pointer
> #define PTR_ALIGNMENT_BITS 3
> 
> namespace std
> {
>    template <typename T>
>    shared_ptr<T> atomic_load(const shared_ptr<T>* p)
>    {
>      const size_t i = ((reinterpret_cast<size_t>(p) >> 
> PTR_ALIGNMENT_BITS) & (__shared_ptr_spinlocks_size - 1));
>      while (__shared_ptr_spinlocks[i].test_and_set()) ; // spin
>      shared_ptr<T> r = *p;
>      __shared_ptr_spinlocks[i].clear();
>    }
> 
>    template <typename T>
>    shared_ptr<T> atomic_store(shared_ptr<T>* p, shared_ptr<T> r)
>    {
>      const size_t i = ((reinterpret_cast<size_t>(p) >> 
> PTR_ALIGNMENT_BITS) & (__shared_ptr_spinlocks_size - 1));
>      while (__shared_ptr_spinlocks[i].test_and_set()) ; // spin
>      swap(*p, r);
>      __shared_ptr_spinlocks[i].clear();
>    }
> 
>    // etc.
> }

Probably you know it already, but just in case ...
There's a piece of compatibility code in libstdc++ that does already
something like that:
libstdc++-v3/src/c++11/compatibility-atomic-c++0x.cc
(__atomic_flag_for_address)

Cheers,
Oleg



More information about the Libstdc++ mailing list