且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-21 15:41:06

转自:http://blog.csdn.net/kkxgx/article/details/7506085

一,线程安全基础

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

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

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

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

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

  1. unsigned int next=1;  
  2. int rand(void)  
  3. {  
  4.      next=next*1103515245+12345;  
  5.      return (unsigned int )(next/65536)%32768;  
  6. }  
  7. void srand(unsigned int seed)  
  8. {  
  9.      next=seed;  
  10. }  

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多线程学习笔记五--线程安全【转】

【作者】张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.