当前位置: 技术问答>linux和unix
free函数引发的问题
来源: 互联网 发布时间:2016-02-01
本文导语: 在free的时候,如果有信号发生,会进入信号处理函数,如果在信号处理函数中还要free会出现问题吗?我现在好像出现阻塞得问题.不知道为什么. | free函数是不可冲入的。 | 信号处...
在free的时候,如果有信号发生,会进入信号处理函数,如果在信号处理函数中还要free会出现问题吗?我现在好像出现阻塞得问题.不知道为什么.
|
free函数是不可冲入的。
|
信号处理函数中又需要释放别的内存
-----------------------------------
如果你申请得到的内存还存在的话,free()是没有问题。。。
也就是说在释放内存时候加已判断下!
-----------------------------------
如果你申请得到的内存还存在的话,free()是没有问题。。。
也就是说在释放内存时候加已判断下!
|
在大部分系统中,malloc 和 free 都不是可重入的,因为它们使用静态数据结构来记录哪些内存块是空闲的。实际上,任何分配或释放内存的库函数都是不可重入的。这也包括分配空间存储结果的函数。
避免在处理器分配内存的最好方法是,为信号处理器预先分配要使用的内存。避免在处理器中释放内存的最好方法是,标记或记录将要释放的对象,让程序不间断地检查是否有等待被释放的内存。不过这必须要小心进行,因为将一个对象添加到一个链并不是原子操作,如果它被另一个做同样动作的信号处理器打断,那么就会“丢失”一个对象。不过,如果您知道当信号可能到达时,程序不可能使用处理器那个时刻所使用的流,那么就是安全的。如果程序使用的是某些其他流,那么也不会有任何问题。
来自:
http://www.ibm.com/developerworks/cn/linux/l-reent.html
避免在处理器分配内存的最好方法是,为信号处理器预先分配要使用的内存。避免在处理器中释放内存的最好方法是,标记或记录将要释放的对象,让程序不间断地检查是否有等待被释放的内存。不过这必须要小心进行,因为将一个对象添加到一个链并不是原子操作,如果它被另一个做同样动作的信号处理器打断,那么就会“丢失”一个对象。不过,如果您知道当信号可能到达时,程序不可能使用处理器那个时刻所使用的流,那么就是安全的。如果程序使用的是某些其他流,那么也不会有任何问题。
来自:
http://www.ibm.com/developerworks/cn/linux/l-reent.html