LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2199|回复: 8

[求助]多线程编程时,使用了new,和使用malloc一样都是不可重入的吧?

[复制链接]
发表于 2005-6-8 11:52:30 | 显示全部楼层 |阅读模式
找了一些资料看,没有明确的说明。
有些编译器对new的实现可能是使用malloc,这样就不能重入了。
有些不知道怎么实现new的
:help
发表于 2005-6-8 16:58:08 | 显示全部楼层
对,不可重入,但线程安全.
回复 支持 反对

使用道具 举报

发表于 2005-6-8 22:17:55 | 显示全部楼层
问一下,为什么说“线程安全”?
回复 支持 反对

使用道具 举报

发表于 2005-6-8 22:28:31 | 显示全部楼层
就是函数可以多个线程一起使用啊。gethostbyname就不是了。
malloc不可重入,但线程安全。

可重入是线程安全的充分非必要条件!
回复 支持 反对

使用道具 举报

发表于 2005-6-9 08:10:37 | 显示全部楼层
多谢,还想再问一下,如果在多线程中使用,那就有可能“重入”。那么 malloc 在什么情况下不可“重入”?
回复 支持 反对

使用道具 举报

发表于 2005-6-9 08:51:48 | 显示全部楼层
呵呵,刚才在网上大概搜了一下,居然看到两种截然不同的说法:

(1)“可重入”和“线程安全”是两个独立的概念(不互为条件)

(2)可重入的是线程安全的,不可重入的不是线程安全的(充分必要)

要是 Tetris 兄有这方面的权威资料,就整出来秀一下吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-9 11:02:03 | 显示全部楼层
对啊,搞糊涂了!
象malloc是不可重入的,它应该不符合thread-safe啊。
例如能够在多线程环境下使用的libc.a,里面的malloc应该都是封装过的,例如用信号量实现互斥。
所以又如何说是线程安全呢?
回复 支持 反对

使用道具 举报

发表于 2005-6-9 14:43:23 | 显示全部楼层
不可重入是指不能执行到一半,被中断后从头执行,例如信号处理函数里就不可调用不可重入函数,例如printf,malloc。
线程安全是指可多个线程一起使用,标准库里的所有函数都被规定是线程安全的。如果有的函数要用到全局变量,内部可用某些机制互斥。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-13 19:29:46 | 显示全部楼层
找了点资料,搞懂了。
线程安全是指多个线程调用同一个函数,如果是线程安全的,那么每次的结果都是正确。
可重入函数是指函数内部没有使用共享变量。
可重入函数是线程安全函数的一个真子集。
下面一个函数就是线程安全但却不可重入的

static int *sharedID;
int* threadsafe_getID( char* name )
{
    int *unsharedID;
    P( &mutex );
    sharedID = notThreadsafe_getID( name );
    unsharedID = sharedID;
    V( & mutex);
    return unsharedID;
}
上面的函数通过P、V操作封装得到一个线程安全函数,却不是可重入函数。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表