我目前正在使用带有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尝试删除这些线程时发生崩溃?有人可以指出我是否在多线程环境中使用共享指针做错了什么?
答案 0 :(得分:3)
shared_ptr
不是线程安全的,因为不允许从多个线程访问相同实例。但是,使用指向同一对象的两个不同的shared_ptr
实例是线程安全的,只要该对象本身是线程安全的。另请参阅the documentation
因此,如果您将shared_ptr
存储为Class
中的引用,则可能会崩溃。请改为复制shared_ptr
。