一、互斥
1. 概念
在多线程中对临界资源的排他性访问。
临界资源:在多线程中,会对这个资源进行读写操作的。如:全局变量、文件、设备。
排他访问:在多线程中,只能有一个线程进行读写操作的。
2. 用途
在多线程中,一个资源同一时刻,只能有一个线程访问

th1, th2, 是两个线程,是并发运行。也就是代码在运行时,是穿插进行的。
如果A++,这个指令翻译成汇编是3句(至少)。在一次线程的调度,这3句汇编,不一定一次性执行。也就是说可能 th1 执行了 1,2步,就切换到th2 执行。这个时候就会发生错误(数据的一致行性出现问题)。
解决方案,使用互斥。
3. 互斥的使用步骤
定义互斥锁 ==》 初始化锁 ==》 加锁 ==》 解锁 ==》 销毁
4. 相关函数




二、同步
1. 概念
有一定先后顺序的对资源的排他性访问。
2. 用途
在多线程中,线程按照一定顺序运行。

3. 与互斥锁的关系和区别
互斥包含同步,同步是互斥的一个特例

1)互斥锁,加锁和解锁 是同一个线程
信号量(同步),th1 释放th2, th2释放th1. 是由线程交叉释放。
2)在互斥锁保护的代码中(临界区)。不要休眠,不要大耗时的操作。临界区代码要短小精悍
信号量,适当可以有休眠(当初值不为1的时候,休眠有时候时设计的样子),小的耗时操作。
3)用法: 计数信号量 。信号量的初值(3,5)是可以大于1的。
这种情况,用于互斥的情况,资源数本身不唯一(多个资源)
4. 同步的使用步骤
信号量的定义 =》 信号量的初始化 ==》 信号量的PV操作 =》 信号量的销毁。
5. 相关函数




6. 死锁
由于锁资源安排的不合理(锁资源的申请和释放逻辑不对)
导致进程,线程无法正常继续执行(推进)的现象。
