线程堆栈大小限制

时间:2020-07-25 13:55:47

标签: c++ multithreading c++11

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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