一. 多线程不安全函数的定义
1. 多线程不安全函数
多线程不安全函数是指:一个进程中有很多全局变量以及函数(error、strtok、asctime等),各个线程对这些变量会产生干扰。
具体情况为:在多线程运行期间,库中每个线程有自己的本地存储空间,有时也会使用全局变量和静态变量,如果多线程同时访问全局变量和静态变量,就将出现意向不到的错误。这个在现在的多线程编程中一般都会通过同步机制(例如,加锁操作等)解决,但是,我们往往忽略了C run-time library 里面的一些函数使用了全局变量和静态变量,却没使用相应机制避免冲突。
2. 什么是线程安全?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
二. 线程不安全解决方法
1. 解决方法
线程不安全即当多个线程同时访问同一块资源时,造成资源数据不一致或数据污染。
解决方法如下:
(1) 加锁。
(2) 用局部变量保存数据。
2. glibc 库中线程不安全函数举例
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
readdir() 函数为读取目录内容功能。readdir() 函数因为内部使用了静态数据,即readdir() 函数调用成功时,返回指针所指向的 dirent 结构体是静态分配的,所以,readdir() 函数被认为不是线程安全的函数。
解决方法可以采用局部变量保存数据,也可以加锁使用;当然还可以使用readdir_r() 函数。
版权归原作者 凌肖战 所有, 如有侵权,请联系我们删除。