可重入性和线程安全_可重入性全局变量危险

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

原文链接: https://blog.csdn.net/dog250/article/details/5303374

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    可重入性和线程安全_可重入性全局变量危险

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/410336

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午11:57
下一篇 2023年4月26日 上午11:57

相关推荐