一、互斥锁
1、资源:
资源是有限的,在程序运行过程中,一段代码、一段空间、一个变量、CPU、内存都可以看做资源
2、互斥锁: 是一种资源,当一个线程任务加锁,其余线程任务无法再次加锁,直到解锁后才能加锁,互斥锁主要是用来防止多个线程任务竞争某个资源,加锁和解锁中间的代码称为临界代码也称为临界区。
需要注意:
互斥锁不能同步,多个任务依然保持异步执行,但是可以解决资源竞争
原子操作:最小的一次CPU操作,在执行原子操作时不会切换调度任务
二、死锁
1、概念:多线程加锁解锁导致多个任务均无法向下执行的状态称为死锁状态简称为死锁
2、死锁产生的4个必要条件:
1.互斥条件:同一把锁不能被多个线程任务同时锁定
2.不剥夺条件:不剥夺条件是指一个线程任务已经锁定了一个资源,不能被其他线程任务抢占,直到它使用完该资源
3.请求和保持条件:如果没有拿到锁资源一直申请获得锁资源
4.循环等待条件:如果没有得到锁资源会一直等待
3、如何避免产生死锁:
1.加锁顺序保持一致
2.打破互斥条件、不可剥夺条件(不建议使用)
3.使用pthread_mutex_trylock替代pthread_mutex_lock
三、信号量
1、作用:实现多线程间同步
信号量是一种资源(可以初始化、销毁、申请、释放)
申请:资源数 > 0 申请操作让资源数-1
资源数 == 0 申请操作会阻塞,直到资源数不为0,申请得到资源后继续向下执行
释放:资源数+1
释放操作让资源数+1