多线程笔记

(1)
进程:进程是程序运行的一个实例。进程有自己的内核对象,以及地址空间。它是系统资源分配的最小单位。
线程:线程是进程的一个执行流。线程有自己的内核对象,以及堆栈空间。它是系统调度的最小单位。

一个进程可以有多个进程,线程间共享进程的资源,通信方便,线程间的切换开销小。进程之间的地址空间相互独立,通信需要相应的通信方式:如管道,文件,套接字等。并且进程之间的切换开销大。
由于线程共享进程空间,一个线程假死,会导致进程死掉的。所以多进程会更加健壮!
(2)
死锁:第一个线程在等待第二个线程资源锁,而第二个线程又在等待第一个线程的资源锁,导致一种相互的环形等待。此次为俩个线程的情况,推广多个,形成一个大环!

死锁形成的四个必要条件:

1、互斥。对于资源,首先是互斥的!
2、不可抢占。即线程间不可以抢占另一个的。
3、持有并等待。占用资源并且等待其他资源。有点像看着碗里的,盯着锅里的,呵呵!
4、循环等待。即形成环形的等待的情况。相互等待,并且不释放资源。

预防死锁,只需破坏上面四个条件的一个。想避免条件1、2、3不太容易。
对于4,可以通过算法来实现。需判断当前是否形成环。然后打破环,即可继续进行下去!
将各个线程的所需资源列出,然后判断形成的,资源图中,是否有环(可利用DFS算法!)。(个人思路!)
(3)
可重入  线程安全:(此部分部分参照他人,没记下出处,此处道歉)

重入:相同的(并且合法的)函数参数(包括无参函数的情况),多次调用此函数产生的行为是可预期的

即函数的行为一致,或者结果相同。即使在多线程的情况也是如此。(不能使用全局变量以及静态变量关键!局部变量!)


线程安全:一个线程安全的函数通过“锁”来保护共享资源不被并发地访问。来达到预期串行的结果。

俩者:可重入一定是线程安全的,而线程安全不一定可重入。

为了保证函数是可重入的,需要做到一下几点:

1,不在函数内部使用静态或者全局数据

2,不返回静态或者全局数据,所有的数据都由函数调用者提供

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

4, 如果必须访问全局数据,使用互斥锁来保护

5,不调用不可重入函数



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值