可重入性和线程安全

 

这个话题被大家说了很多遍,网上也有很多网友的blog可以参考,我发现了一个很直观的讲解,特转载过来(作者dog250),供大家分享。


可重入性就是线程安全吗?很多人包括我自己起初都不过分区分它们,实际上也没有过分它们的必要,程序员是干活的,就像民工只要浇铸混凝土就可以了,然而如果程序员对一些平常的操作知其所以然后,就可能成为策划者。
      首先这两者都是和共享变量,全局变量,静态变量相关的,因为传统的c语言都是串行过程化操作的,c语言里面并没有线程的概念,在没有线程的日子里,一切都 很幸福,那时的世界就是c语言本真的世界,全局变量和静态变量很好的为程序服务,一切那么安详,全局变量仿佛生活在自己的仙境里,没有任何责备,那时它很 幸福,然而线程打破了这种宁静,线程,这个冯诺依曼家族的怪胎使得全局变量成了罪恶的根源,在冯氏家族,本应该是串行的过程世界,线程的出现,使得大家带 着脚镣跳舞,这种痛苦加之这个世界固有的惰性带来了罪恶,这种罪恶就是并发,全局变量不再像以前那样自然,如果你的代码中有了全局变量,那么它很可能带来 一个同步问题,比如一个全局变量,两个线程操作,那么必然要给这个全局变量戴上脚镣,呵呵,真的很不公不平,明明线程是个入侵者,为何把脚镣拷在全局变量 脚上,虽然不公平,但是我们必须接受事实,这个世界上永远都是这样,有时候牵强的东西虽然不好,但是我们必须接受,因为立法者永远不被我们触摸。
      因此,如果一个函数的实现里面在不加锁的情况之下随意操作全局变量,那么它就是线程不安全的,因为该函数没有限制全局变量,没有让全局变量更加“适应”线 程。那么什么是可重入函数呢?顾名思义,可重入就是一个执行绪没有离开这个函数的时候允许另一个执行绪进入该函数。线程安全强调的是该函数的实现操作,而 可重入性则更多的强调该函数的调用规则,因此函数的可重入性约束要高于线程安全,可重入函数一定是线程安全的,可重入函数除了不能随意无锁操作全局或静态 变量外还不能返回它们,因为可重入性是调用相关的,一个函数的调用有几个方面:调用,实现,参数,返回值。

补充:可重入性是由信号引入的,参考apue2 Section 10.6。因为子线程随时可能在某个函数里被中断,然后去运行另一个线程,如果另一个线程里也恰好调用了这个函数,这样是否线程安全也同样被提出来了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值