linux多线程学习笔记五--线程安全

一,线程安全基础

一个函数被称为线程安全的当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。我们能够定义出四类线程不安全函数。

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

共享变量在多线程中是共享数据,可以通过同步机制来保护共享数据。

第二类:保护跨越多个调用状态的函数

一个伪随机数生成器是一个简单的例子:

unsigned int next=1;
int rand(void)
{
     next=next*1103515245+12345;
     return (unsigned int )(next/65536)%32768;
}
void srand(unsigned int seed)
{
     next=seed;
}
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

二、可重入性

有一类重要的线程安全函数,叫做可重入函数,其特点:当它们被多个线程调用时,不会引用任何共享数据。可重入、线程安全函数之间的关系如下图。

linux多线程学习笔记五--线程安全_第1张图片


你可能感兴趣的:(多线程,linux,unix,存储)