本文共 1038 字,大约阅读时间需要 3 分钟。
转自:
版权声明:本文为博主原创文章,未经博主允许不得转载。
一,线程安全基础
一个函数被称为线程安全的当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。我们能够定义出四类线程不安全函数。
第一类:不保护共享变量的函数
共享变量在多线程中是共享数据,可以通过同步机制来保护共享数据。
第二类:保护跨越多个调用状态的函数
一个伪随机数生成器是一个简单的例子:
rand函数是线程不安全的,因为当前调用的结果依赖于前次调用的中间结果。
第三类:返回指向静态变量的指针的函数
某些函数(如gethostbyname)将计算结果放在静态结构中,并返回一个指向这个结构的指针。在多线程中一个线程调用的结构可能被另一个线程覆盖。可以通过重写函数和加锁拷贝技术来消除。加锁拷贝技术指在每个位置对互斥锁加锁,调用线程不安全函数,动态的为结果分配存储器,拷贝函数返回的结构,然后解锁。
第四类:调用线程不安全函数
常见的系统线程不安全函数:
线程不安全函数 | 线程不安全 类 | unix线程安全版本 |
rand | 2 | rand_r |
strtok | 2 | strtok_r |
asctime | 3 | asctime_r |
ctime | 3 | ctime_r |
gethostbyaddr | 3 | gethostbyaddr_r |
geyhostbyname | 3 | gethostbyname_r |
inet_ntoa | 3 | |
localtime | 3 | localtime_r |
二、可重入性
有一类重要的线程安全函数,叫做可重入函数,其特点:当它们被多个线程调用时,不会引用任何共享数据。可重入、线程安全函数之间的关系如下图。