线程安全和可重入函数

1.什么是线程安全?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
2.如何避免
要避免线程的不安全,我们应该知道怎样造成线程的不安全(就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据)。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
线程安全性不是一个非真即假的命题–>但是它的线程安全性是有限制的,即在某些方法之间有状态依赖
下面我们说下线程安全的四个级别

  • 不可变:不可变的对象一定是线程安全的,并且永远也不需要额外的同步[1] 。因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态
  • 有条件的:有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。通常,独占性的访问是由对锁的同步保证的 。
  • 线程兼容:线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安全地使用。为了最大程度地利用线程兼容类,如果所有调用都使用同一个块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。
  • 线程对立:线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现的类。

3.什么是可重入函数,由什么特点?
Insert函数被不同的控制流程调⽤,有可能在第⼀次调⽤还没返回时就再次进⼊该函 数,这称为重⼊,Insert函数访问⼀个全局链表,有可能因为重⼊⽽造成错乱,像这样的函数称为 不可重⼊函数,反之,如果⼀个函数只访问⾃⼰的局部变量或参数,则称为可重入函数
下面我有函数和图解释下重入

void insert(node_t *p)
{
1.p->next=head;
4.head=p;
}
void sighandler(int signo)
{
...
insert(&node2);
...
}
void insert(node_t *p)
{
2.p->next=head;
3.head=p;
}
node_t node1,node2,*head;
int main()
{
...
insert(&node1);
...
}

图中的标号和代码是相对应的
如果一个函数符合下面条件之一是不可重入的

  1. 调用malloc,realloc,calloc和free,因为他们是全局链表来管理的
  2. 调用标准I/O库函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值