五、科大软件工程(孟宁)(5:多线程)

对于程序员来讲多线程意味着什么?

多线程

函数的可重入性(reentrant)

线程安全

可重入的函数是线程安全的吗?

用互斥锁让linktable中所有函数可重入

互斥锁

如何使linktable线程安全呢?

读写锁
什么是函数的可重入性?

可重入(reentrant)函数可以由多于一个任务并发使用,
而不必担心数据错误。相反,不可重入(non-reentrant)
函数不能由超过一个任务所共享,除非能确保函数的互斥
(或者使用信号量,或者在代码的关键部分禁用中断)。
可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。
可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。

可重入函数:

这就不是一个可重入函数
int a = 0;
public void sat(){
    a++;
    print(a);
}
对比一下
这就是一个可重入函数
public void sat(int a){
    a++;
    print(a);
}

改成这样就是可重入函数

对于这两个而言就不是可重入的,对比厕所使用的两个门
不为连续的调用持有静态数据。

不返回指向静态数据的指针;所有数据都由函数的调用者提供。

使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。

绝不调用任何不可重入函数。

什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,
而这些线程可能会同时运行这段代码。
如果每次运行结果和单线程运行的结果是一样的,
而且其他的变量的值也和预期的是一样的,就是线程安全的。 

线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

函数的可重入性与线程安全之间的关系

可重入的函数不一定是线程安全的;

可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(可能是线程安全的也可能不是线程安全的);

不可重入的函数一定不是线程安全的;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值