线程安全和可重入函数
一 线程安全
1 比如说,现在有一篮子苹果,有大有小,然后有一群人要来拿苹果了
在线程非安全情况下:
所有人一哄而上,变成了抢苹果了,因为大家都想要大的苹果,会发生冲突的
在线程安全情况下:
把这一篮子苹果放到一个小屋里面,然后锁起来,然后每次只让一个人进去拿,等那个人拿完然后再让下一个人进去拿,这样保证了每个人都能拿到苹果,而且不会出现冲突。
在线程非安全情况下:
所有人一哄而上,变成了抢苹果了,因为大家都想要大的苹果,会发生冲突的
在线程安全情况下:
把这一篮子苹果放到一个小屋里面,然后锁起来,然后每次只让一个人进去拿,等那个人拿完然后再让下一个人进去拿,这样保证了每个人都能拿到苹果,而且不会出现冲突。
2 线程安全的概念
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
二 可重入函数
可重入函数的概念:可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的
举个例子来说:比如main函数中的insert()函数执行时,信号量来临,处理信号是进入到handler函数当中,在handler函数中再次调用insert()函数。也就是说有两个执行流同时执行一个函数,这就叫做函数的重入
三 线程安全和可重入函数之间的联系
如图所示可重入函数一定是线程安全,线程安全不一定是可重入函数