线程安全与可重入函数

线程安全:如果多线程同时运行同一代码块的结果每次都和单线程运行的结果一样,则就是线程安全的

◆线程不安全的本质原因是资源共享。 所以不使用任何共享数据的线程是安全的

◆使用全局变量的函数是非线程安全的。

◆使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。

◆可以通过线程同步将一个不安全线程转变成安全的


可重入函数:可重入函数主要用于多任务环境中,即它可以被多个执行流调用,它是一种可中断函数。它可以在任意时刻被中断,而当它被中断后,系统去执行另一段代码,再次回到中断的地方执行后面的代码时不会出现任何错误。如果出现结果错误则这个函数就是不可重入函数。

满足下列条件的函数多数是不可重入的:

1) 函数体内使用了静态的数据结构;

2) 函数体内调用了malloc()或者free()函数;

3) 函数体内调用了标准I/O函数。

可重入函数编写规范为:

1、不在函数内部使用静态或全局数据 
2、不返回静态或全局数据,所有数据都由函数的调用者提供。 
3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
4、如果必须访问全局变量,利用互斥机制来保护全局变量。
5、不调用不可重入函数。


线程安全与可重入函数之间的关系:
1、一个函数对于多个线程是可重入的,则这个函数是线程安全的。
2、一个函数是线程安全的,但并不一定是可重入的。【使用互斥锁实现的线程安全】
3、可重入性要强于线程安全性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章