我目前在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
。