对比线程安全和可重入函数

          1.线程安全

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用,不会出现数据不一致或者数据污染的情况;简而言之,一个函数若被多个并发的线程反复调用时,都会产生正确的结果;   

      2.可重入函数

      可重入函数指一个函数当被多个线程调用时,不会产生任何的“共享数据”,所谓“共享数据”可指:(1)函数将返回结果放于一个公共的位置;(2)由调用者传入的线程间共享的指针变量或引用变量;(3)函数内部本会使用的共享静态变量;

      3.线程安全和可重入函数的比较

       1)一个函数对于多个线程是可重入的,则该函数是线程安全的;

    2)一个函数是线程安全的,但并不一定是可重入的,如使用互斥锁实现的线程安全;

    3)可重入性要强于线程安全性;

    任何线程不安全问题的根源都是“共享数据”。所以,不使用任何共享数据的函数(即:可重入函数)肯定是线程安全的。但这并不等于说,线程安全函数就是可重入函数。为什么呢?因为:即使线程有共享数据,线程被并发调用的时候产生的结果可以是正确的。那么这种正确性是如何保证的呢?就是通过同步操作进行保证的;

         对于线程安全和可重入函数有如下几点说明:

         1)C语言类型的可重入函数是线程安全的;

         2)可重入的成员函数未必是线程安全的;

         3)线程安全的函数未必是可重入的;

         实例:可重入却线程不安全的成员函数

class Counter
{
public:
Counter() { n = 0; }
void increment() { ++n; }
void decrement() { --n; }
int value() const { return n; }
private:
int n;
};
             线程安全和锁的使用关系密切,很多时候线程安全是靠锁来保证的

   


       

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值