我正在一个项目中,在其中创建了一个由8个线程组成的线程池,每个保持线程都有自己的队列,数据进入队列,然后由各个线程选择该队列,然后对其进行处理。现在,这里的线程堆栈大小为8MB,因此我的线程在任何时候都将耗尽内存,因为这些线程永远不会结束,并且只有在应用程序关闭时才会被杀死。
在这些线程中,我有本地STL容器(unnordered_map),在其中我继续添加数据并继续删除它们。那么,我的线程是否有机会报告OOM错误,因为它永远不会结束?...
此外,在c ++ 11中,有没有一种方法可以增加线程的堆栈大小?...
答案 0 :(得分:0)
线程的执行永无休止的事实并不意味着它将耗尽堆栈。您会看到,线程不会通过深入调用堆栈来执行任务。一个工作线程基本上是这样做的:
while (have_tasks_left()) {
auto task = get_next_task();
execute_a_task(task);
}
在任何给定时间,线程的堆栈只有一个task
对象。
现在,如果您担心线程的 queue 会溢出任务-实际上,这不是堆栈问题。您线程的队列在线程本地存储中甚至在堆栈上都有其基本数据结构-但是这些队列在堆栈外分配了更大的缓冲区(例如std::queue
或std::priority_queue
)。这意味着您仅受可用系统内存量的限制。