测试对象是否未被删除
Testing if object is not deleted
我的对象创建了一个线程,该线程在其生命周期中修改了对象创建者。问题是,线程在被销毁时不应该调用对象方法。我已经找到了解决该问题的一些方法,我想知道它是否是最好的方法。
class A
{
shared_ptr<int> guard = make_shared<int>(0);
public:
weak_ptr<int> getGuard() { return guard; }
void method() {}
A()
{
thread([this]
{
const auto &guard = getGuard();
while(!guard.expired())
method();
});
}
};
您拥有的 while 循环不是确保 method
仅在 guard
指向的对象仍然存在时才被调用的线程安全方法。这样做的原因是另一个线程可能会在调用 expired
和调用 method
.
之间导致对象的破坏。
执行此检查的安全方法是尝试将弱指针提升为共享指针:
while (true)
{
shared_ptr<int> sp = getGuard().lock();
if (sp)
{
method();
}
else
{
return;
}
}
通过将弱指针提升为共享指针,调用代码在调用 method
期间参与对象的所有权,确保在调用代码使用它时它不会被销毁.
您也未能加入或分离线程。从您的示例来看,您似乎想要分离它,以便 A
的构造函数可以在线程完成执行之前退出。在这种情况下,您的代码应如下所示:
thread([this]
{
...
}).detach();
如果要确保对象在调用 method
时不被销毁,但可以在其他时间被销毁,则需要在对象本身,并在调用该方法时锁定它。类似于:
class A : std::enable_shared_from_this<A>
{
public:
void method() {}
A()
{
std::weak_ptr<A> self(shared_from_this());
thread([=self]
{
while (auto This = self.lock())
This->method();
}).detach();
}
};
此对象现在只能通过 make_shared
创建——尝试以任何其他方式创建它会导致未定义的行为并且可能会崩溃。
我的对象创建了一个线程,该线程在其生命周期中修改了对象创建者。问题是,线程在被销毁时不应该调用对象方法。我已经找到了解决该问题的一些方法,我想知道它是否是最好的方法。
class A
{
shared_ptr<int> guard = make_shared<int>(0);
public:
weak_ptr<int> getGuard() { return guard; }
void method() {}
A()
{
thread([this]
{
const auto &guard = getGuard();
while(!guard.expired())
method();
});
}
};
您拥有的 while 循环不是确保 method
仅在 guard
指向的对象仍然存在时才被调用的线程安全方法。这样做的原因是另一个线程可能会在调用 expired
和调用 method
.
执行此检查的安全方法是尝试将弱指针提升为共享指针:
while (true)
{
shared_ptr<int> sp = getGuard().lock();
if (sp)
{
method();
}
else
{
return;
}
}
通过将弱指针提升为共享指针,调用代码在调用 method
期间参与对象的所有权,确保在调用代码使用它时它不会被销毁.
您也未能加入或分离线程。从您的示例来看,您似乎想要分离它,以便 A
的构造函数可以在线程完成执行之前退出。在这种情况下,您的代码应如下所示:
thread([this]
{
...
}).detach();
如果要确保对象在调用 method
时不被销毁,但可以在其他时间被销毁,则需要在对象本身,并在调用该方法时锁定它。类似于:
class A : std::enable_shared_from_this<A>
{
public:
void method() {}
A()
{
std::weak_ptr<A> self(shared_from_this());
thread([=self]
{
while (auto This = self.lock())
This->method();
}).detach();
}
};
此对象现在只能通过 make_shared
创建——尝试以任何其他方式创建它会导致未定义的行为并且可能会崩溃。