"线程安全" 和 "可重入" 是一个概念吗?(更正帖子)
对不起,刚才发错了一个帖子,将“线程安全”写成“信号安全”了,
现在更正:
"线程安全 " 和 "可重入 " 是一个概念吗? 如果不是,区别在哪里?
[解决办法]
我觉得 可重入是针对多线程中调用同一函数处理的防止异步共享导致数据不安全
它是线程安全一个可靠保证
它和线程安全应该属于一种必要关系
也就是保证纤尘安全必须保证多线程的调用函数均为可重入
而仅仅满足可重入不能满足线程安全
线程安全建立在很多安全基础之上, 需要使用信号,原子操作防止发生数据不一致导致不安全
[解决办法]
学习
[解决办法]
可重入函数,是线程安全函数的一种。特点:当它们被多个线程调用时,不会引用任何共享数据,也就是不引用静态或全局变量。
请参考下面这篇文章:
http://blog.chinaunix.net/u/15929/showart.php?id=116221
[解决办法]
基本上可以认为,如果代码是可重入的(reentrant),或者通过某种形式的互斥而实现对并发访问的保护,则代码是线程安全的。
[解决办法]
怪不得,我想了半天都不知道 信号安全 跟 可重入 有什么关系 = =!
哈哈,信号安全 大学一门课,我挂了 = =!
[解决办法]
mark
[解决办法]
我认为线程安全是由可重入和互斥两部分组成。
[解决办法]
线程安全 和 可重入 其实是2个东西,
不过一般情况下可以认为 可重入函数都是 线程安全的
也有其他 情况,这个要看定义了,比如
void foo(int *i)
{
int b = *i;
b++;
*i = b;
};
这个函数不是线程安全的,但是可重入
如果一个函数使用线程本地存储,互斥体等,也可以实现线程安全,但是可以不是 可重入的
[解决办法]
这两个不是一个意思。但有时候有重叠。在多线程情况下,县城安全是可重入的必要条件。但是线程安全不一定能保证可重入。
比如单线程程序的函数,当然不存在线程安全问题,但不一定就是可重入的。比较经典的例子是最早DOS的TSR程序,由于用了同一堆栈指针,函数重入的时候会把栈写坏。还有比如Fortran一类的不支持递归的语言,由于变量是静态地址,无法可重入。
总之对于可重入函数,里面不能有大家同时可以用的公共资源。比如下面程序:
int 阶乘(int n)
{
static int i = 1;
if (n)
i = i * 阶乘(n-1);
else
i = 0;
return i;
}
即使单线程也会出问题。
[解决办法]
Chiyer(星羽) 兄给出了全局变量的线程安全处理示例:这种情况说明的是多个线程实例并发操作同一存储区域的数据的问题,就应用角度来说,本身就是不可重入的。
可重入的定义请翻阅相关课本。
微软早期的OS中的多线程是不可重入的,比如下面这个线程函数并发 3 次
void fun(void*p)
{
int i = 0;
++i;
}
最后得到的结果可能是 1,2,3 中任何结果。可能当时微软的多线程函数中的局部变量不是采用的堆栈,而是采用的共享存储。当时要做到线程函数中的局部变量相互独立(即保证线程安全,也可以说保证线程函数可重入----但可重入表现在计算科学各方面,不只是线程),Borland 提供了 C++ 多线程库。