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

简介: 转自:http://blog.csdn.net/kkxgx/article/details/7506085 版权声明:本文为博主原创文章,未经博主允许不得转载。 一,线程安全基础 一个函数被称为线程安全的当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。

转自: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

 

二、可重入性

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

【作者】 张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
目录
相关文章
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
5月前
|
安全 Java
并发编程系列教程(02) - 多线程安全
并发编程系列教程(02) - 多线程安全
16 0
|
6月前
|
Java
Java并发编程和多线程的区别
Java并发编程和多线程的区别
61 0
|
1月前
|
安全 Java
Java并发编程中的线程安全问题与解决方法
在Java开发中,线程安全是一个至关重要的话题。本文将深入探讨Java并发编程中常见的线程安全问题,并结合实际案例介绍解决这些问题的方法,帮助读者更好地理解和应对多线程环境下的挑战。
22 1
|
2月前
|
缓存 安全 Java
Java并发编程中的线程安全性问题与解决方法
【2月更文挑战第6天】在Java并发编程中,线程安全性一直是一个重要的问题。本文将深入探讨Java中线程安全性问题的根源,以及针对这些问题提出的解决方法,包括使用同步关键字、Lock对象、volatile关键字等。通过本文的学习,读者将更好地理解Java并发编程中的线程安全性问题,并能够运用相应的解决方法来保障程序的稳定性和可靠性。
24 4
|
8月前
|
调度 双11
多线程的创建方法--多线程基础(一)
线程为一个"执行流". 每个线程之间都可以按照自己的顺序执行.
|
存储 安全 Java
线程、多线程、线程安全等入门指南
线程、多线程、线程安全等入门指南
线程、多线程、线程安全等入门指南
|
缓存 Java
理论:第八章:线程是什么,有几种实现方式,它们之间的区别是什么,线程池实现原理,JUC并发包,ThreadLocal与Lock和Synchronize区别
理论:第八章:线程是什么,有几种实现方式,它们之间的区别是什么,线程池实现原理,JUC并发包,ThreadLocal与Lock和Synchronize区别
102 0
|
Java 编译器 调度
基本的线程机制—Java编程思想
并发编程使我们可以将程序分为多个分离的、独立运行的任务。通过使用多线程机制,这些独立人物(也被称为子任务)中的每一个都将由执行线程来驱动。 一个线程就是在进程中的一个单一的顺序控制流,因此,单个进程可以拥有多个并发执行的任务。 在使用线程时,CPU将轮流给每个任务分配其占用时间。 线程的一大好处是可以使你从这个层次抽身出来,即diamante不必知道它是运行在具有一个还是多个CPU的机器上。
|
安全 Java 调度
Java多线程(4)--线程的同步解决线程安全问题
Java多线程(4)--线程的同步解决线程安全问题
87 0

热门文章

最新文章