代码之家  ›  专栏  ›  技术社区  ›  Anna B

并发引用计数器类和作用域保留:这样可以吗?

  •  2
  • Anna B  · 技术社区  · 14 年前

    这是一个关于编码设计的问题,所以请原谅长代码列表:如果没有显示实际的代码,我就无法恢复这些想法和潜在的缺陷。

    我正在编写一个ConcurrentReferenceCounted类,希望对我的实现提供一些反馈。该类的子类将收到“release”,而不是直接删除。

    这是课程:

    class ConcurrentReferenceCounted : private NonCopyable {
     public:
      ConcurrentReferenceCounted() : ref_count_(1) {}
    
      virtual ~ConcurrentReferenceCounted() {}
    
      void retain() {
        ScopedLock lock(mutex_);
        ++ref_count_;
      }
    
      void release() {
        bool should_die = false;
        {
          ScopedLock lock(mutex_);
          should_die = --ref_count_ == 0;
        }
        if (should_die) delete this;
      }
    
     private:
      size_t ref_count_;
      Mutex mutex_;
    };
    

    这里是一个范围保留:

    class ScopedRetain {
    public:
      ScopedRetain(ConcurrentReferenceCounted *object) : object_(object) {
        retain();
      }
    
      ScopedRetain() : object_(NULL) {}
    
      ~ScopedRetain() {
        release();
      }
    
      void hold(ConcurrentReferenceCounted *object) {
        assert(!object_); // cannot hold more then 1 object
        object_ = object;
        retain();
      }
    
    private:
      ConcurrentReferenceCounted *object_;
    
      void release() {
        if (object_) object_->release();
      }
    
      void retain() {
        object_->retain();
      }
    };
    

    最后是一个用例:

    Object *target;
    ScopedRetain sr;
    
    if (objects_.get(key, &target))
      sr.hold(target);
    else
      return;
    
    // use target
    // no need to 'release'
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Alexander Gessler    14 年前

    你的 ConcurrentReferenceCounted 似乎使用了全静音,这是不必要的,也不是很快。引用计数可以使用依赖于体系结构的互锁指令原子地实现。在窗户下面, InterlockedXXX 函数系列只是包装这些指令。