折返(Reentrancy)VS线程安全(Thread safety)
在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)相关推荐
- 线程安全(thread safe)是什么?
警告:我不是一个多线程编程的专家.事实上,甚至不能说我可以胜任这个东西.我的整个职业生涯,需要用到多线程来实现代码的次数也不多.所以请用一个怀疑的态度来看待我以下的所有观点. 有一个我经常问的问题是: ...
- 线程(Thread,ThreadPool)、Task、Parallel
线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Fr ...
- Thread Safety in the Standard C++ Library
2019独角兽企业重金招聘Python工程师标准>>> Thread Safety in the Standard C++ Library When /MT , /MTd, /MD ...
- python线程创建对象_Python线程下thread对象的用法介绍(附实例)
本篇文章给大家带来的内容是关于Python线程下thread对象的用法介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Thread对象 Thread类用于表示单独的控制 ...
- this.getstate_Java线程类Thread.State getState()方法(带示例)
this.getstate 线程类Thread.State getState() (Thread Class Thread.State getState()) This method is avail ...
- 进程(Process)和线程(Thread)的区别
在Linux系统中,进行并行计算编程,经常会将进程(Process)和线程(Thread)混淆,下面我们以表格的形式对二者进行对比,帮助大家能更清晰的理解二者之间的区别. Process和Thread ...
- JAVA - 守护线程(Daemon Thread)
转载自:http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html 在Java中有两类线程:用户线程 (User Thread) ...
- 线程(Thread)和异常
线程(Thread)和异常 参考文章: (1)线程(Thread)和异常 (2)https://www.cnblogs.com/ghq120/p/8280693.html 备忘一下.
- JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)
一.异常 异常 :指的是程序在执⾏过程中,出现的⾮正常的情况,最终会导致JVM的⾮正常停⽌. 在Java等⾯向对象的编程语⾔中,异常本身是⼀个类,产⽣异常就是创建异常对象并抛出了⼀个 异常对象.Jav ...
最新文章
- CacheHelper
- Java学习---RMI 技术分析[Hessian]
- opencv清晰度,色偏等评价函数
- git checkout 对工作目录的影响 —— Git 学习笔记 21
- tarjan对有向图的缩点(求强连通分量)
- 支持向量机(SVM)推导
- 案例解读:RMAN 备份控制文件报错 ORA-00230
- linux软链接和硬链接的区别
- HTML 实现扫雷游戏
- java 抽象类命名_Java命名规范
- 教你利用铁威马NAS为电脑存储空间扩容
- 一款PHP版三合一收款码_附50多款模板源码
- 中标麒麟V7系统开启日志服务器收集日志
- OSG给模型贴图显示
- 大数据高级开发工程师——Spark学习笔记(10)
- 豆瓣读书top250数据爬取与可视化
- Codevs 1586 学校食堂
- Python人工智能之图片转文字识别
- 几个图像缩放算法的比较
- mysql主从同步检测