可重入函数以及函数的线程安全性以及二者相关

1)可重入函数

      主要针对系统出现中断时,程序进入信号处理程序。那么函数同时在主程序和中断处理中是否能同时出现。比如如果进程进行malloc在堆中分配空间,而此时由于进程由于中断,进入信号处理程序也要调用mallocc,这时可能会更改malloc维护的链表。还有就是同时修改一个静态存储单元比如同时调用getwnam()函数,其中有一个静态存储单元要修改。

如何判断一个程序可重入

a 已知使用静态数据结构

b 调用malloc和free

c 是标准I/O函数:标准I/O函数的很多实现都以不可重入的方式使用全局数据结构

2)线程安全性

1  如何判断一个函数是否线程
a, 函数中访问全局变量和堆。
b, 函数中分配,重新分配释放全局资源。
c, 函数中通过句柄和指针的不直接访问。
d, 函数中使用了其他线程不安全的函数或者变量。
编写线程安全函数注意事项:
1, 减少对临界资源的依赖,尽量避免访问全局变量,静态变量或其它共享资源,如果必须要使用共享资源,所有使用到的地方必须要进行互斥锁 (Mutex) 保护;
2, 线程安全的函数所调用到的函数也应该是线程安全的,如果所调用的函数不是线程安全的,那么这些函数也必须被互斥锁 (Mutex) 保护;


3) 可重入函数与线程安全相关
当一个函数在被一个线程调用时,可以允许被其他线程再调用。显而易见,如果一个函数是可重入的,那么它肯定是线程安全的。但反之未然,一个函数是线程安全的,却未必是可重入的。程序开发人员应该尽量编写可重入的函数。
一个函数想要成为可重入的函数,必须满足下列要求:
a) 不能使用静态或者全局的非常量数据
b) 不能够返回地址给静态或者全局的非常量数据
c) 函数使用的数据由调用者提供
d) 不能够依赖于单一资源的锁
e) 不能够调用非可重入的函数

posted on 2015-08-05 09:16  菜鸟基地  阅读(251)  评论(0)    收藏  举报

导航