免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cugb_cat
打印 上一主题 下一主题

malloc 的可重入性 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-05-29 19:32 |只看该作者
线程安全与可重入完全是两个不同的概念!
通常只要不涉及维护静态数据, 一般都是线程安全的. POSIX里面规定了malloc是线程安全的.

[ 本帖最后由 accelerator 于 2007-5-29 19:34 编辑 ]

论坛徽章:
0
22 [报告]
发表于 2007-05-29 19:45 |只看该作者
原帖由 MMMIX 于 2007-5-29 17:52 发表

http://www.unet.univie.ac.at/aix ... hread_safe_code.htm

建议看看,reentrancey 和 thread safety 是两个不同的概念。

这里给的链接中关于可重入的一个解决办法就用到了malloc
/* reentrant function (a poor solution) */
char *strtoupper(char *string)
{
        char *buffer;
        int index;

        /* error-checking should be performed! */
        buffer = malloc(MAX_STRING_SIZE);

        for (index = 0; string[index]; index++)
                buffer[index] = toupper(string[index]);
        buffer[index] = 0

        return buffer;
}
malloc在大部分的libc里应该没问题的。。。见过哪个开源项目多线程的代码malloc上了锁的么?

论坛徽章:
0
23 [报告]
发表于 2007-05-29 19:48 |只看该作者
原帖由 feasword 于 2007-5-29 19:45 发表

这里给的链接中关于可重入的一个解决办法就用到了malloc
/* reentrant function (a poor solution) */
char *strtoupper(char *string)
{
        char *buffer;
        int index;

        /* error ...


错了

论坛徽章:
0
24 [报告]
发表于 2007-05-29 19:55 |只看该作者
原帖由 accelerator 于 2007-5-29 19:32 发表
线程安全与可重入完全是两个不同的概念!
通常只要不涉及维护静态数据, 一般都是线程安全的. POSIX里面规定了malloc是线程安全的.

说是不同
哪位给最好能给个一个either reentrant or thread-safe的例子
想到的情况无非就是没有互斥使用stack以外的数据,实在看不出区别

论坛徽章:
0
25 [报告]
发表于 2007-05-29 19:55 |只看该作者
在这个链接中找到下面几句话:
http://www.laptev.org/doc/pthreads.html

Well, suppose that each thread calls printf():

                printf("i=%d s=%s\n",anint,astring);

The printf() call makes implicit use of malloc() to allocate the buffer that holds the string you are printing.

.......

The POSIX threads specification does demand that the calls in the C library (including malloc() and printf()) be thread-safe.

论坛徽章:
0
26 [报告]
发表于 2007-05-29 20:05 |只看该作者
楼主似乎已经说的很清楚了,还需要看什么具体实现?

请解释:
  malloc/free 是在 C 标准中规定的,而在 C 中是没有进程/线程的概念的,因而也就不存在可不可重入的问题。

malloc/free 在哪里规定的和它是不是可重入似乎没有必然联系。
楼主的问题是在linux下开启多线程,并调用malloc/free,会不会因为它们的不可重入性带来什么问题。

原帖由 MMMIX 于 2007-5-29 16:23 发表

这种和实现相关的问题就应该去看具体的实现。

另外,malloc/free 是在 C 标准中规定的,而在 C 中是没有进程/线程的概念的,因而也就不存在可不可重入的问题。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
27 [报告]
发表于 2007-05-29 20:29 |只看该作者
原帖由 softsongs 于 2007-5-29 20:05 发表
楼主似乎已经说的很清楚了,还需要看什么具体实现?

请解释:
  malloc/free 是在 C 标准中规定的,而在 C 中是没有进程/线程的概念的,因而也就不存在可不可重入的问题。

malloc/free 在哪里规定的和它 ...

这话只是想说明 C 标准并不关心(甚至也根本没有)重入之类的概念,而不是说某个 C 标准库的函数是线程不安全或者不可重入的。

老实说,这句其实和当前的讨论没有什么关系,可以算得上是题外话。

论坛徽章:
0
28 [报告]
发表于 2007-05-29 20:40 |只看该作者
原帖由 feasword 于 2007-5-29 19:55 发表

说是不同
哪位给最好能给个一个either reentrant or thread-safe的例子
想到的情况无非就是没有互斥使用stack以外的数据,实在看不出区别


The  strtok_r()  function is a reentrant version strtok().

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
29 [报告]
发表于 2007-05-29 20:55 |只看该作者

  1. static volatile int v_lock = 0;
  2. void *f_malloc_r(size_t size) {
  3.       void *mem_block;

  4.       while(v_lock) {
  5.       }
  6.       v_lock = 1;
  7.       mem_block = malloc(size);
  8.       v_lock = 0;
  9.       return mem_block;
  10. }
  11. void f_free_r(void *mem_block) {
  12.       while(v_lock) {
  13.       }
  14.       v_lock = 1;
  15.       free(mem_block);
  16.       v_lock = 0;
  17. }
复制代码

论坛徽章:
0
30 [报告]
发表于 2007-05-29 21:39 |只看该作者
原帖由 cobras 于 2007-5-29 20:55 发表
[code]
static volatile int v_lock = 0;
void *f_malloc_r(size_t size) {
      void *mem_block;

      while(v_lock) {
      }
      v_lock = 1;
      mem_block = malloc(size);
      v_lock  ...




volatile声明的变量正常情况下, 不能用来做这个互斥操作吧.

两个thread一人执行一句就死了(虽然发生概率极小....感觉都快成为不可能事件了)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP