我正在阅读有关锁定和设计的应用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();
之前被调用。在这种情况下,对象将已经被删除并且指针无效。