shared_ptr与QThreadPool

时间:2014-03-31 04:49:22

标签: c++ multithreading qt threadpool shared-ptr

我目前正在使用带有QThreadPool的共享指针来实现多线程应用程序。但是,当线程完成计算时,我遇到了崩溃。

假设A类继承自QRunnable,当传入共享指针作为参数时,它会更新其类变量。这是代码:

for(int i=0;i<1000;i++)
{
    boost::shared_ptr<VariableType> variable = boost::make_shared<VariableType>();
    variable->Update_One_InternalVariable(1); // just updating a class variable inside VariableType

    Class* A = new Class(variable);
    A->setAutoDelete(true);

    QThreadPool::globalInstance()->start(A);

    m_thread_count++;

    if(m_thread_count >0 && m_thread_count %4== 0)
    {
        QThreadPool::globalInstance()->waitForDone(); // crashes after all threads finished here
    }
}
QThreadPool::globalInstance()->waitForDone();

在4个线程执行并结束后不久发生了崩溃。我假设当QThreadPool尝试删除这些线程时发生崩溃?有人可以指出我是否在多线程环境中使用共享指针做错了什么?

1 个答案:

答案 0 :(得分:3)

shared_ptr 是线程安全的,因为不允许从多个线程访问相同实例。但是,使用指向同一对象的两个不同的shared_ptr实例是线程安全的,只要该对象本身是线程安全的。另请参阅the documentation

因此,如果您将shared_ptr存储为Class中的引用,则可能会崩溃。请改为复制shared_ptr