# 线程安全 & 线程安全函数 & 线程不安全函数

来源:互联网 发布:淘宝嘉年华是什么活动 编辑:程序博客网 时间:2024/05/17 06:26

线程安全 & 线程安全函数 & 线程不安全函数

  线程安全 就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
  如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
  一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
  线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

线程不安全函数主要分为以下四大类:

第1类:不保护共享变量的函数,

函数中访问全局变量和堆。
共享变量在多线程中是共享数据比如全局变量和堆,如果不保护共享变量,多线程时会出bug。
可以通过同步机制来保护共享数据,比如加锁。

第2类:函数中分配,重新分配释放全局资源。

与上面第一点基本相同,通过加锁可解决

第3类:返回指向静态变量的指针的函数,函数中通过句柄和指针的不直接访问。

比如,我们要计算a,b两个变量的和,于是将a,b的指针传入某一个函数,然而此时可能有另一个线程改变了a,b的值,此时在函数中我们通过地址取到的两个数的值已经改变了,所以计算出的结果也就是错的了。
又比如某些函数(如gethostbyname)将计算结果放在静态结构中,并返回一个指向这个结构的指针。在多线程中一个线程调用的结构可能被另一个线程覆盖。可以通过重写函数和加锁拷贝技术来消除。加锁拷贝技术指在每个位置对互斥锁加锁,调用线程不安全函数,动态的为结果分配存储器,拷贝函数返回的结构,然后解锁。

第4类:调用线程不安全函数的函数

线程不安全函数 线程不安全 类 unix线程安全版本 rand 2 rand_r strtok 2 strtok_r asctime 3 asctime_r gethostbyaddr 3 gethostbyaddr_r geyhostbyname 3 geyhostbyname_r inet_ntoa 3 localtime 3 localtime_r

在编写线程安全函数时,要注意两点:
1、减少对临界资源的依赖,尽量避免访问全局变量,静态变量或其它共享资源,如果必须要使用共享资源,所有使用到的地方必须要进行互斥锁 (Mutex) 保护;
2、线程安全的函数所调用到的函数也应该是线程安全的,如果所调用的函数不是线程安全的,那么这些函数也必须被互斥锁 (Mutex) 保护;

1 0
原创粉丝点击