malloc 的线程安全与不可重入性
malloc的线程安全
线程安全就是多个线程并发执行相同代码,程序的结果依然是正确的。malloc 由于操作的是堆上的空间,所以如果要实现线程安全,就需要对 malloc 加锁。
malloc 的不可重入性
可重入函数简单来说就是可以被中断的函数,在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,执行完返回原函数时不会有错误。可重入的要求比线程安全高,可重入必定是线程安全的,但线程安全不一定可重入。
如果在 malloc 的过程中发生了信号中断,而在信号处理程序中也需要执行 malloc :
- 如果 malloc 使用普通锁:直接就会发生死锁。
- 如果 malloc 使用递归锁:在信号处理程序中可以执行 malloc,但是可能会破坏共享的内存链表等信息。
tcmalloc
tcmalloc (Thread-Caching Malloc)是 Google 开发的内存分配器,每个线程都有自己的缓存内存,所以在最佳的情况下,可以从 thread cache 中实现无锁内存分配和内存释放。