gpt4 book ai didi

c++ - 测试对象是否未被删除

转载 作者:行者123 更新时间:2023-11-30 01:47:52 24 4
gpt4 key购买 nike

我的对象创建了一个线程,该线程在其生命周期中修改了对象创建者。问题是,线程在被销毁时不应该调用对象方法。我已经找到了该问题的一些解决方案,我想知道它是否是最好的解决方案。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com