线程安全与可重入函数

线程安全:

如果一个函数被多个并发线程同时调用时,它仍然能产生正确的结果,那么这个函数就是线程安全的。

要确保线程安全,关键是线程之间的共享变量的访问。如果多个线程之间访问了相同的共享变量,这个时候如果没有加任何安全措施,就很有可能出现错误。比如各个属于同一进程的线程访问全局变量时,很有可能会得到错误的结果。若要确保线程安全那就可以通过加锁的方式。


可重入函数:

关于可重入没有确切的解释,不过可以这样理解:如果执行流执行到foo()函数,这个时候来了一个信号,程序就会转而去处理信号处理函数,信号处理函数在执行过程中又调用了foo()函数,这个时候就发生了重入。如果这个时候两个foo()依然能正确运行,那么foo()就是可重入的。

可重入函数是线程安全的一种,或者说是线程安全函数的子集。多个线程或执行流进入可重入函数时,该函数没有访问全局或静态变量,依然能产生正确结果。

可重入函数分为显式可重入和隐式可重入:

显式可重入函数:如果函数的参数是传值方式,并且只访问本地对象,没有访问全局对象,它就是显式可重入函数;

隐式可重入函数:如果函数的参数是传引用(指针)方式,但是引用(指针)指向的是非共享变量,函数内部也没有访问全局或静态变量,它就是隐式可重入函数。

简单理解就是可重入函数没有访问全局或静态变量,因此不会产生一些竞态结果。

1.如果一个函数访问了全局或静态变量,则它既不是线程安全函数也不是可重入函数;

2.在第一步基础上,通过加锁的方式能使该函数成为线程安全的函数,但不一定是可重入函数。加锁适用于多线程访问情况,一个线程内部可能会出错;

3.如果把访问全局或静态变量改成传参或其他方式,则有可能是该函数变成可重入函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值