Ala*_*lan 8 c++ winapi multithreading
我知道在应用程序中创建太多线程并不是你可能称之为其他正在运行的进程的"好邻居",因为即使这些线程处于有效的休眠状态,也会消耗cpu和内存资源.
我感兴趣的是:睡眠线程消耗了多少内存(win32平台)?
从理论上讲,我假设在1mb的区域内(因为这是默认的堆栈大小),但我很确定它不到这个,但我不确定为什么.
任何有关这方面的帮助将不胜感激.
(我问的原因是我正在考虑引入一个线程池,我想通过创建一个包含5个线程的池来节省多少内存,而不是20个手动创建的线程)
我有一个服务器应用程序,它在线程使用量很大,它使用一个由客户设置的可配置线程池,并且在至少一个站点中它有1000多个线程,并且在启动时它只使用50 MB.原因是Windows 保留堆栈为1MB(它映射其地址空间),但它不一定分配在物理内存中,只是它的一小部分.如果堆栈增长超过生成页面错误并分配更多物理内存.我不知道初始分配是什么,但我认为它等于系统的页面粒度(通常为64 KB).当然,线程在创建时也会为其他东西使用更多的内存(TLS,TSS等),但我对总数的猜测大概是200 KB.请记住,任何不经常使用的内存都将由虚拟内存管理器卸载.
添加到法比奥斯评论:
内存是你的第二个关注点,而不是你的第一个关注点。线程池的目的通常是限制想要并发运行的线程之间的上下文切换开销,最好限制为可用的 CPU 核心数量。
上下文切换非常昂贵,通常需要几千到 10,000+ 个 CPU 周期。
在 WinXP(32 位)上进行的一个小测试显示每个线程大约有 15k 专用字节(创建了 999 个线程)。这是初始提交的堆栈大小,加上操作系统管理的任何其他数据。