在Wiki上,折返例如,下面的定义(接)

In computing, a computer program or subroutine is called reentrant if it can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution. The interruption could be caused by an internal action such as a jump or call, or by an external action such as a hardware interrupt or signal. Once the reentered invocation completes, the previous invocations will resume correct execution.

翻译过来,就是说在函数运行的过程中。假设发生了中断被迫运行其他动作。其中断运行完毕后(中断运行过程中可能会再次调用该函数)。再次又一次返回函数的时候。可以恢复正确的运行过程。

显然。定义里面并没有强调必须是多线程,并且wiki上也进一步说明了一个事实

This definition originates from single-threaded programming environments where the flow of control could be interrupted by a hardware interrupt and transferred to an interrupt service routine (ISR).

简单翻译。可重入的定义是依据单线程,而且控制流能够被硬件中断打断的环境的。因此普通情况下并没有涉及和考虑到多线程的情况。

我们再来看看线程安全的wiki定义(具体链接)

Thread safety is a computer programming concept applicable in the context of multi-threaded programs. A piece of code is thread-safe if it only manipulates shared data structures in a manner that guarantees safe execution by multiple threads at the same time. There are various strategies for making thread-safe data structures.

简单翻译,线程安全就是保证多线程同一时候运行函数时,可以以保证安全运行的情况下操作共享数据。

这里强调了运行的上下文必须为多线程环境。
  
        从以上两个概念的定义我们能够看到。可重入并不一定是线程安全,线程安全也并不一定是可重入的。在这里,能够举两个样例来说明

首先,是一个可重入但不是线程安全的样例。

下面代码段里。把局部变量s保留了全局变量t的状态,可以在中断发生之后恢复原来运行状态。符合可重入的定义。但非常明显。因为无法确保全局数据的一致性(没加锁)。因此不是线程安全

int t;void swap(int *x, int *y)
{int s;s = t; // save global variablet = *x;*x = *y;// hardware interrupt might invoke isr() here!*y = t;t = s; // restore global variable
}void isr()
{int x = 1, y = 2;swap(&x, &y);
}

然后是一个线程安全但不是可重入的样例。因为对静态变量counter的訪问之前都相互排斥锁进行同步,因此是线程安全的。但假设获取了相互排斥锁,没有释放锁的过程里。发生了中断,这时候假设在中断里再次调用函数,则会发生死锁。因此不是可重入的。

#include <pthread.h>int increment_counter ()
{static int counter = 0;static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_lock(&mutex);// only allow one thread to increment at a time++counter;// store value before any other threads increment it furtherint result = counter; pthread_mutex_unlock(&mutex);return result;
}

由以上两个样例里,更加清晰地说明了两者之间并不一定相互决定的关系。一般来说,实现可重入要注意在函数运行过程中。假设要保存运行进度的状态,要考虑把状态保存到局部变量(栈),TLS。不能保存在全局或者静态变量,另外还要注意不能调用其他不可重入的函数。

最后。经过在网络上的一些调查搜索,发现了部分人对可重入有第二种理解。

简单来说,就是可重入也包含多线程的情况,也就是说当单一线程在函数运行过程中。会保证当另外线程运行的正确性。

也就是可重入包含了对单线程的重入和多线程的重入,显然后者有更强的限定性,同时也保证线程安全。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

折返(Reentrancy)VS线程安全(Thread safety)相关推荐

  1. 线程安全(thread safe)是什么?

    警告:我不是一个多线程编程的专家.事实上,甚至不能说我可以胜任这个东西.我的整个职业生涯,需要用到多线程来实现代码的次数也不多.所以请用一个怀疑的态度来看待我以下的所有观点. 有一个我经常问的问题是: ...

  2. 线程(Thread,ThreadPool)、Task、Parallel

    线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Fr ...

  3. Thread Safety in the Standard C++ Library

    2019独角兽企业重金招聘Python工程师标准>>> Thread Safety in the Standard C++ Library When  /MT , /MTd, /MD ...

  4. python线程创建对象_Python线程下thread对象的用法介绍(附实例)

    本篇文章给大家带来的内容是关于Python线程下thread对象的用法介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Thread对象 Thread类用于表示单独的控制 ...

  5. this.getstate_Java线程类Thread.State getState()方法(带示例)

    this.getstate 线程类Thread.State getState() (Thread Class Thread.State getState()) This method is avail ...

  6. 进程(Process)和线程(Thread)的区别

    在Linux系统中,进行并行计算编程,经常会将进程(Process)和线程(Thread)混淆,下面我们以表格的形式对二者进行对比,帮助大家能更清晰的理解二者之间的区别. Process和Thread ...

  7. JAVA - 守护线程(Daemon Thread)

    转载自:http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html 在Java中有两类线程:用户线程 (User Thread) ...

  8. 线程(Thread)和异常

    线程(Thread)和异常 参考文章: (1)线程(Thread)和异常 (2)https://www.cnblogs.com/ghq120/p/8280693.html 备忘一下.

  9. JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)

    一.异常 异常 :指的是程序在执⾏过程中,出现的⾮正常的情况,最终会导致JVM的⾮正常停⽌. 在Java等⾯向对象的编程语⾔中,异常本身是⼀个类,产⽣异常就是创建异常对象并抛出了⼀个 异常对象.Jav ...

最新文章

  1. CacheHelper
  2. Java学习---RMI 技术分析[Hessian]
  3. opencv清晰度,色偏等评价函数
  4. git checkout 对工作目录的影响 —— Git 学习笔记 21
  5. tarjan对有向图的缩点(求强连通分量)
  6. 支持向量机(SVM)推导
  7. 案例解读:RMAN 备份控制文件报错 ORA-00230
  8. linux软链接和硬链接的区别
  9. HTML 实现扫雷游戏
  10. java 抽象类命名_Java命名规范
  11. 教你利用铁威马NAS为电脑存储空间扩容
  12. 一款PHP版三合一收款码_附50多款模板源码
  13. 中标麒麟V7系统开启日志服务器收集日志
  14. OSG给模型贴图显示
  15. 大数据高级开发工程师——Spark学习笔记(10)
  16. 豆瓣读书top250数据爬取与可视化
  17. Codevs 1586 学校食堂
  18. Python人工智能之图片转文字识别
  19. 几个图像缩放算法的比较
  20. mysql主从同步检测

热门文章

  1. ubuntu 10.04 安装eclipse及其中文语言包
  2. 邮件安全隐患及其防范技术研究
  3. Visual Studio Code Go 插件文档翻译
  4. 机器学习研究的七个迷思
  5. 型网站的架构设计问题----大型高并发高负载网站的系统架构
  6. mysql之 CentOS系统针对mysql参数优化
  7. 【Oracle Database】数据库用户管理
  8. iOS LLDB调试命令(Low Lever Debug)
  9. 云计算重构渠道商的价值基础,推动渠道商向服务商转型
  10. 用函数制作简单的选项卡