Thread-safe lock-free array

后端 未结 3 1903
伪装坚强ぢ
伪装坚强ぢ 2020-12-19 04:01

I have a C++ library, which supposed to do some computations on multiple threads. I made independent threads code (i.e. there are no shared variables between them), except f

3条回答
  •  爱一瞬间的悲伤
    2020-12-19 04:08

    Here is a cleaned up version of your AtomicUInt64 type:

    template
    struct MobileAtomic
    {
      std::atomic atomic;
    
      MobileAtomic() : atomic(T()) {}
    
      explicit MobileAtomic ( T const& v ) : atomic ( v ) {}
      explicit MobileAtomic ( std::atomic const& a ) : atomic ( a.load() ) {}
    
      MobileAtomic ( MobileAtomic const&other ) : atomic( other.atomic.load() ) {}
    
      MobileAtomic& operator=( MobileAtomic const &other )
      {
        atomic.store( other.atomic.load() );
        return *this;
      }
    };
    
    typedef MobileAtomic AtomicUInt64;
    

    and use:

    AtomicUInt64 value;
    myVector->push_back ( value );
    

    or:

    AtomicUInt64 value(x);
    myVector->push_back ( value );
    

    your problem was you took a std::atomic by value, which causes a copy, which is blocked. Oh, and you failed to return from operator=. I also made some constructors explicit, probably needlessly. And I added const to your copy constructor.

    I would also be tempted to add store and load methods to MobileAtomic that forwards to atomic.store and atomic.load.

提交回复
热议问题