我正在阅读有关锁定和设计的应用C ++书。

void addRef() { ref++; }
void subRef() { if(--ref == 0) delete this; }



  尽管像ref ++这样的语句看起来很琐碎,但不能保证
  那是原子的。但是在您去重写此代码以添加之前
  锁定,您需要知道您的应用程序将如何使用它。在这个
  在特定示例中,如果在subRef之后调用addRef,则会创建一个错误。
  问题不在于缺少锁,而是设计不佳。如果有物体
  必须保留在线程范围之外,应该创建并拥有它
  通过另一个不会超出范围的线程。


我对以上文字的问题是


作者所说的不良设计是什么意思,以及如何通过“如果对象必须在线程范围之外持久存在,应由不会超出范围的其他线程创建和拥有该对象”来避免这种情况。 ?要求对此举一个例子。

最佳答案

void thread1work(RefCntObj* refcntObj)
{
  refcntObj.addRef();
  // any work
  refcntObj.subRef();
}

int main(void) {
  RefCntObj* refcntObj= new RefCntObj(); // I assume the constructor calls addRef()
  std::thread t(thread1work, std::ref(f));
  refcntObj->subRef(); // may be called after thread1Work or before it
}


无法保证thread1work将在main的refcntObj->subRef();之前被调用。在这种情况下,对象将已经被删除并且指针无效。

10-04 12:58