函数的线程安全和可重入性

1、基本概念

线程安全:如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。

可重入:函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入性解决函数运行结果的确定性和可重复性。可重入函数编写规范为:
1、不在函数内部使用静态或全局数据
2、不返回静态或全局数据,所有数据都由函数的调用者提供。
3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
4、不调用不可重入函数。

对于普通的C函数的可重入是指当一个函数被不同的线程同时访问的时候,每一个调用都独自使用自己的一份数据,多次调用之间不存在数据共享。所以C语言可重入的函数一定是线程安全的。

在C++中存在类成员函数,而对于类成员函数可重入是指:在被多个线程在不同实例里面访问(每个线程一个实例)时,不存在共享数据,也不会有数据冲突。类是可重入表示类的所有成员函数都是可重入的。
类的线程安全是说:类的同一个实例被多个线程访问的时候,对数据的操纵是序列化的,不会有访问冲突。

所以对于C++ 的成员函数来说,是可以访问成员变量,所以同一个实例在被不同的线程访问的时候就有可能造成数据共享,也就有可能造成线程不安全。因此可重入的成员函数未必是线程安全的。
      无论对于C语言的函数还是C++类的成员函数,线程安全的函数都未必是可重入的。

2、不可重入->可重入

可重入概念只和函数访问的变量类型有关,所以把一个不可重入的函数修改为可重入的函数只需要修改函数中变量类型即可。如原来函数换回的时静态空间替换为内部分配堆空间,或者采用跟好的方式是由调用者提供空间。

3、线程不安全->线程安全

对于c函数可以使用上面中的方式把函数变成可重入的函数。另外一种方法就是对共享资源加锁。

4、常见C函数介绍

     线程安全的函数:

image

image

image

image

image

image

 

     线程不安全的函数:

image

image

posted @ 2013-03-23 23:06  startcool  阅读(599)  评论(0编辑  收藏  举报