gpt4 book ai didi

c++ - shared_ptr 与 QThreadPool

转载 作者:行者123 更新时间:2023-11-30 02:47:28 25 4
gpt4 key购买 nike

我目前正在将共享指针与 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 的拷贝。

关于c++ - shared_ptr 与 QThreadPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22753826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com