一、线程安全
1、什么是线程安全?
如果一个进程中有多个线程在同时运行,这些线程可能会同时运行同一段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就表示线程是安全的。
线程安全问题是由全局变量和静态变量引起的。
2、如何避免线程安全问题
(1)使用线程安全的类
(2)使用synchronized同步代码块,或者用Lock锁
(3)多线程并发情况下,线程共享的变量改为方法局部级
变量
二、可重入函数
1、什么叫可重入函数?
信号的捕捉可以让进程内部有多种执行流,被两个或者多个执行流进入同一个函数叫做重入。若因为重入的原因导致函数的结果出错,则该函数叫做不可重入函数。
2、不可重入函数
(1)调用了malloc或者free,因为malloc和free是用全局链表来管理堆的;
(2)调用了标准I/O库函数,标准I/O库的实现很多都以不可重入的方式使用全局数据结构;
(3)某些被规定用线程安全的方式实现的函数;
(4)函数体内使用了静态变量;
(5)函数返回静态变量或者静态的数据结构;
(6)函数调用了不可重入函数。
3、可重入函数
(1)不使用全局或者静态变量;
(2)不返回指向静态数据的指针,所有数据都由函数调用者来提供;
(3)使用本地数据,或通过制作全局数据的本地拷贝来保护全局数据;
(4)不调用不可重入函数。
4、可重入函数的特点
(1)可重入函数可以被多个任务同时调用,而不担心数据会被破坏;
(2)可重入函数在任何时刻都可以被中断,一段时间之后又可以返回到中断之前的状态,而不担心数据会丢失;
(3)可重入函数若要使用全局变量,则要对全局变量进行保护。
三、对比线程安全和可重入函数
1、可重入的函数一定是线程安全的函数;
2、线程安全的函数不一定是可重入函数;
3、可重入性强于线程安全性。
线程安全和可重入函数
最新推荐文章于 2017-06-30 17:05:16 发布