QThread 中的堆栈大小

Posted

技术标签:

【中文标题】QThread 中的堆栈大小【英文标题】:Stack size in QThread 【发布时间】:2016-07-19 12:34:45 【问题描述】:

QT5C++ 中使用 QThread 时最大的默认堆栈大小是多少?我的线程中有一个 QVector,我正在调用 myvector.append() 方法,我很感兴趣我的向量可以有多大。我发现uint QThread::stackSize() const 方法返回堆栈大小,但前提是它之前被方法setStackSize() 更改过,但默认堆栈大小是多少?

【问题讨论】:

向量的内部结构应该在“堆”上,所以你基本上可以在系统内存中创建最大的单个块。 【参考方案1】:

QThread 堆栈大小可以通过这两个调用来读取和设置:

 uint QThread::stackSize() const
 void QThread::setStackSize(uint stackSize)

如果 Qthread 在不同操作系统中以操作系统特定线程为十年,在 linux 中 pthread 最大堆栈大小为 8M。

但听起来你担心 QVector 在堆栈中增长,这并没有发生。 QVector 将数据存储在堆中。

来自QVector的源代码,

void QVector<T>::append(const T &t)

     ...
    if (!isDetached() || isTooSmall) 
        ...
        reallocData(d->size, isTooSmall ? d->size + 1 : d->alloc, opt);
     ...

它所做的一切都是在 HEAP 中分配新空间(预先分配预定义的元素数量)并确保数据存储在连续的内存空间中。看起来不关心页面边界等。

【讨论】:

【参考方案2】:

只有在编译 32 位应用程序时,堆栈大小才起作用并且您在堆栈上显式地为缓冲区分配存储空间。仅使用自动 QVectorstd::vector 实例不会在堆栈上分配任何大缓冲区 - 您需要为此使用自定义分配器。

IIRC 在 64 位应用程序中,内存的布局使得您永远不会用完任何合理数量的线程的堆栈空间。

【讨论】:

您能否就您在 64 位应用程序上的断言进行开发或评价? + "合理数量的线程" ,这对您意味着什么。谢谢 合理的意思是与逻辑核的数量在同一顺序。 64 位应用程序通常具有 48 位虚拟内存空间,此时堆栈可能大于大多数合理机器上的 RAM 大小。

以上是关于QThread 中的堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章

QThread 移动到线程。 QThread 中的同步

与主线程在 QThread 中创建的连接对象失败,并且一个 QThread 中的对象之间的连接失败

单独的 QThread 中的串行端口

Qt on Python 中的 QThread

QThread与多线程(比较清楚)

QThread 中的 Qt 信号和槽