线程安全引用计数的另一个问题

Ant*_*rov 5 c++ multithreading refcounting

关于如何实现线程安全引用计数器有很多问题.一个常见的高度评价的答案是:"使用原子增量/减量".好的,这是一个很好的方法来读取和写入refCounter whitout其他线程在其间更改它.但.

我的代码是:

void String::Release()
{
    if ( 0 == AtomicDecrement( &refCounter ) ) )
        delete buffer;
}
Run Code Online (Sandbox Code Playgroud)

所以.我安全地减少并阅读refCounter.但是,如果其他线程会在我将它与零比较时将INCREMENT我的refCounter怎么办?

我错了吗?

编辑:(示例)

String* globalString = new String(); // refCount == 1 after that.

// thread 0:
delete globalString; 
  // This invokes String::Release().
  // After AtomicDecrement() counter becomes zero. 
  // Exactly after atomic decrement current thread switches to thread 1.

// thread 1:
String myCopy = *globalString;
  // This invokes AddRef(); 
  // globalString is alive;
  // internal buffer is still not deleted but refCounter is zero;
  // We increment and switch back to thread 0 where buffer will be 
  // succefully deleted;
Run Code Online (Sandbox Code Playgroud)

我错了吗?

vz0*_*vz0 1

你的例子对我来说听起来很正确。

然而,这里的问题不是原子操作,而是手动删除一个对象,然后引用即将删除的对象。如果引用计数不是 1,而是 8,会怎样?

您需要避免手动删除和使对象无效,并更好地使用一些支持并发的智能指针实现来处理引用计数。

每当指针检测到引用计数为零时,您就需要锁定该对象以避免被其他线程引用,就像初始化新引用时的双重检查锁定一样。

  • 当没有对该对象的引用时,另一个线程如何访问该对象? (2认同)