Chinaunix

标题: malloc堆分配函数是线程安全的,但有个关于此函数不是可重入的疑问? [打印本页]

作者: ilogo1    时间: 2012-12-04 15:01
标题: malloc堆分配函数是线程安全的,但有个关于此函数不是可重入的疑问?
1.malloc函数是线程安全的,当在一个进程中多个线程调用此函数时,采用锁机制保证互斥分配堆,因为所有线程共享同一进程的堆。
2.但,试想在单进程环境下,如果进程在分配堆时,恰好一个信号中断了malloc的调用,而这个信号处理函数又一次调用了malloc函数,会导致这个进程死锁才对。
但APUE上说最多会破坏分配区的链表,而且实际中也不可避免的会在信号处理函数中再次调用malloc,也就是不会导致死锁??不明白为什么??

作者: giantchen    时间: 2012-12-05 09:35
回复 1# ilogo1

> 不可避免的会在信号处理函数中再次调用malloc

Really? Why?
   
作者: sonicling    时间: 2012-12-05 10:30
这个不用你担心,操作系统自己知道该如何避免。
作者: safedead    时间: 2012-12-05 10:49
线程安全 < 可重入 < 异步信号安全

malloc是线程安全的
但它不可重入
更不是异步信号安全


作者: bruceteen    时间: 2012-12-05 10:53
同意2楼



作者: ilogo1    时间: 2012-12-05 11:23
那malloc可以废了。。。??你不显示调用,你保证你在信号处理里调用的函数也不调用 ??大人,这不科学啊。。
giantchen 发表于 2012-12-05 09:35
回复 1# ilogo1

> 不可避免的会在信号处理函数中再次调用malloc

作者: giantchen    时间: 2012-12-05 12:00
回复 6# ilogo1


    signal handler 能调用的函数本来就非常有限,限于 async-signal-safe 的少量函数。
    Pthreads 系列函数都不能用,sem* 信号量也不能用。

作者: 蔡万钊    时间: 2012-12-05 12:44
malloc 不会把  signal 关闭啊! 操作系统都知道临界区关中断。
作者: ilogo1    时间: 2012-12-05 14:10
临界区就要关中断??。。。。。。。。。。。。。。。。malloc也要请关中断出手?那出场费有点高哦。。
蔡万钊 发表于 2012-12-05 12:44
malloc 不会把  signal 关闭啊! 操作系统都知道临界区关中断。

作者: ilogo1    时间: 2012-12-05 14:12
有道理。。。受教。。
giantchen 发表于 2012-12-05 12:00
回复 6# ilogo1





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2