提问:malloc是不是线程安全的?
提问:malloc是如何实现的?
线程安全:需要解决多个线程调用函数时访问共享资源的冲突
可重入:需要不再函数内部使用静态或全局数据,不反悔静态或全局数据,也不调用不可重入函数
malloc函数线程安全但不可重入
malloc函数在用户空间要自己管理各进程共享的内存链表,由于有共享资源访问,本身会造成线程不安全。为了做到线程安全,加锁保护。递归锁,如果当程序调用malloc函数时收到信号,在信号处理函数里调用malloc函数,如果使用一般的锁就会造成死锁(信号处理函数中断了原程序的执行)。
按上面的场景,不能保证其可重入性,程序调用malloc函数时收到信号,在信号处理函数里再调用malloc函数就可能破坏共享的内存链表等资源malloc函数访问内核的共享数据结构可以正常的加锁保护,因为一个进程调用malloc函数进入内核时,必须等到返回用户空间前才能执行信号处理函数,这时内核数据结构已经访问完成,内核锁已释放,所以不会有问题
malloc函数的实质体现在,有一个将可用的内存块连接为一个长长的空闲链表原型:
extern void* malloc(unsigned int num_bytes);
用法:#include<malloc.h>/#include<stdlib.h>
调用malloc函数时。它会沿着空闲链表寻找一个大到足以满足用户请求所需要的内存块,