我目前在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尝试删除这些线程时发生崩溃?有人可以指出我在多线程环境中使用共享指针在这里做错了什么吗?

最佳答案

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

因此,如果将shared_ptr作为引用存储在Class中,则可能会崩溃。而是复制shared_ptr

09-27 14:15