首页 > 解决方案 > 线程堆栈大小限制

问题描述

我正在做一个项目,在该项目中,我创建了一个由 8 个线程组成的线程池,每个保持线程都有自己的队列,数据来自该队列,然后由各个线程选择,然后对其进行处理。现在,由于线程堆栈大小为 8MB,因此我的线程在任何时候都会耗尽内存,因为这些线程永远不会结束,并且只有在应用程序出现故障时才会被杀死。

在这些线程中,我有本地 STL 容器( unnordered_map ),在其中我继续添加数据并继续删除它们。那么,我的线程是否有机会报告 OOM 错误,因为它永无止境?...

另外,有没有一种方法可以在 c++11 中增加线程的堆栈大小?...

标签: c++multithreadingc++11

解决方案


线程的执行永无止境这一事实并不意味着它将耗尽堆栈。您会看到,线程不会通过在调用堆栈中越来越深来执行任务。工作线程本质上是这样做的:

while (have_tasks_left()) {
    auto task = get_next_task();
    execute_a_task(task);
}

在任何给定时间,线程的堆栈只有一个task对象。

现在,如果您担心线程的任务队列溢出- 这实际上不是堆栈问题。您的线程队列在线程本地存储中或什至在堆栈中具有其基本数据结构 - 但这些队列从堆栈分配更大的缓冲区(例如std::queuestd::priority_queue)。这意味着您仅受可用系统内存量的限制。


推荐阅读