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

标签 c++ multithreading c++11 design-patterns

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

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/

相关文章:

c# - Form.show() 从另一个线程中的事件开始

java - 我可以同时写入和读取 SocketChannel 吗?

c++ - 与位域相邻的变量会损坏吗?

c++ - 我应该使用 numeric_limits 还是 C limit 宏?

c++ - 引用特定函数参数

c++ - 如何获取模板化 WTL 类对象 C++ 的地址

c++ - 在 IsClassT<T> 中,为什么使用 "int C::*"?我对 int 类型感到困惑

c++ - noexcept 说明符内的参数包

c++ - 在一个线程上用 ppoll 阻塞,在另一个线程上读/写同一个 fds 是否安全?

c++ - 有没有合理的替代重载和完美转发的方案?