内存分配是否会阻塞所有线程?含硬件延迟相关疑问
多线程内存分配阻塞与内存延迟参数的疑问解答
问题1:C/C++线程执行内存分配时,其他线程是否会被阻塞?
答案是否定的,并非所有线程都会被阻塞,具体取决于你使用的内存分配器:
- 现代主流分配器(比如Linux下的
ptmalloc、Windows下的HeapAlloc)都实现了线程本地缓存(TLS):每个线程会预先保留一小段内存池,常规的malloc/new请求直接从本地缓存分配,全程无锁,不会阻塞其他线程。 - 只有当线程本地缓存耗尽,需要向操作系统申请大块内存时,分配器才会获取全局锁,此时只有其他同样在申请内存且需要竞争全局锁的线程会被阻塞,不涉及内存分配的线程仍能正常运行。
- 像
talloc、jalloc这类自定义分配器,若设计时考虑了线程安全,也会采用类似的无锁本地缓存或细粒度锁机制,不会导致全线程阻塞。
问题2:内存硬件参数CL16/CL18是否对应内存分配时的阻塞时间?
答案是否定的,二者完全不是一回事:
- CL(CAS Latency,列地址选通延迟)是内存硬件的核心参数,指CPU发出内存读取指令后,实际拿到数据所需的时钟周期数,它影响的是内存访问的速度,而非内存分配的阻塞时间。
- 内存分配的阻塞时间主要来自这几个环节:分配器的全局锁竞争、操作系统内核的物理页分配与页表建立、内存不足时的磁盘页交换。CL延迟仅在分配完成后**首次访问该内存(触发缺页异常,将物理页加载到CPU缓存)**时才会体现,且只是整个访问耗时中的一部分。
- 简单来说:CL参数管的是“拿到内存里的数据要多久”,而内存分配的阻塞管的是“拿到内存使用权要多久”,二者指向的是完全不同的环节。
内容的提问来源于stack exchange,提问作者Another HM
相关产品推荐
相关产品推荐

