免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 16823 | 回复: 25

[函数] 多线程使用malloc [复制链接]

论坛徽章:
0
发表于 2008-01-26 15:53 |显示全部楼层
看到不少帖子说malloc是不可重入函数,并建议在多线程程序中不要用它。那么,在多线程条件下,要从heap中分配动态空间该怎么办呢?
另外,我觉得对malloc这类不可重入函数,只要在调用前用mutex保护起来,也不会出现问题。为什么会有人建议在多线程中不要用malloc呢?

论坛徽章:
0
发表于 2008-01-26 15:54 |显示全部楼层
多线程中可以使用,别用在信号处理函数中就行了。

论坛徽章:
0
发表于 2008-01-26 16:02 |显示全部楼层
2楼正解,看看Richard Stevens的APUE学习下吧, 10.6. Reentrant Functions的例子里,在信号处理函数里面getpwnam调用了malloc,结果运行一段时间就会segmentation fault了,^_^.
Figure 10.5. Call a nonreentrant function from a signal handler
#include "apue.h"
#include <pwd.h>

static void
my_alarm(int signo)
{
    struct passwd   *rootptr;

    printf("in signal handler\n");
    if ((rootptr = getpwnam("root")) == NULL)
            err_sys("getpwnam(root) error");
    alarm(1);
}

int
main(void)
{
    struct passwd   *ptr;

    signal(SIGALRM, my_alarm);
    alarm(1);
    for ( ; ; ) {
        if ((ptr = getpwnam("sar")) == NULL)
            err_sys("getpwnam error");
        if (strcmp(ptr->pw_name, "sar") != 0)
            printf("return value corrupted!, pw_name = %s\n",
                    ptr->pw_name);
    }
}

论坛徽章:
0
发表于 2008-01-26 16:46 |显示全部楼层
谢谢二位

论坛徽章:
0
发表于 2008-01-26 19:23 |显示全部楼层
原帖由 cugb_cat 于 2008-1-26 15:54 发表
多线程中可以使用,别用在信号处理函数中就行了。

长知识,这点真还不知道。
幸好我的程序中内存都使用内存池来处理,要不然还真要碰上这问题了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2010-03-11 11:44 |显示全部楼层
内存池也是不可重入的吧

论坛徽章:
0
发表于 2010-03-11 11:50 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-03-11 11:50 |显示全部楼层
如果多个线程同时去申请内存,会产生什么效果?

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
发表于 2010-03-11 12:16 |显示全部楼层
回复 8# ZSMDEV

多线程并发malloc,估计是有问题的。可以写个测试程序试试

论坛徽章:
0
发表于 2010-03-11 12:40 |显示全部楼层
从没听说过malloc还要做同步。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP