我的对象创建了一个线程,该线程在其生命周期中修改了对象创建者。问题是,线程在被销毁时不应该调用对象方法。我已经找到了该问题的一些解决方案,我想知道它是否是最好的解决方案。
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;
}
}
通过将弱指针提升为共享指针,调用代码在调用方法
期间参与对象的所有权,确保它不会在调用代码使用时被销毁
您也未能加入或分离线程。从您的示例来看,您似乎想要分离它,以便 A
的构造函数可以在线程完成执行之前退出。在这种情况下,您的代码应如下所示:
thread([this]
{
...
}).detach();
关于c++ - 测试对象是否未被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081665/