加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

可重入与线程安全

发布时间:2016-11-03 18:56:12 所属栏目:教程 来源:站长网
导读:看了好多文章,觉得这俩概念很容易混淆。在这里先总结一下自己的理解。 维基百科对可重入的定义是: 若一个程序或子程序可以“安全的被并行执行(Parallel computing)”,则称其为可重入(reentrant或re-entrant)的。 可重入的概念是在单线程操作系统的时

  看了好多文章,觉得这俩概念很容易混淆。在这里先总结一下自己的理解。

维基百科对可重入的定义是:  若一个程序或子程序可以“安全的被并行执行(Parallel computing)”,则称其为可重入(reentrant或re-entrant)的。

可重入的概念是在单线程操作系统的时代提出的。可重入会影响函数的外部接口,而线程安全只关心函数的实现。

可重入函数未必是线程安全的,线程安全的函数也未必是可重入的。例如:

  例1:

  一个函数打开某个文件并读入数据。这个函数是可重入的,因为它的多个实例同时执行不会造成冲突;但它不是线程安全的,因为在它读入文件时可能有别的线程正在修改该文件。

  例2:  

  pthread_mutex_lock(&gLock);

  ........

  pthread_mutex_unlock(&gLock);

  对于上面这段代码,他是线程安全的,但他是不可重入的。是想一下下面的场景,线程1 运行到这段代码,执行完pthread_mutex_lock(&gLock);之后, 这时候还没有来得及释放锁,一个signal产生了,信号处理函数接替线程A获得CPU,恰巧信号处理函数中也调用了这段代码,那么就发生了重入,这时候由于线程1还在持有互斥锁,导致死锁。

 

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读