C#多线程-线程锁
1.无锁算法
2.自旋锁
- 基于原子操作实现 0表示未获取 1表示已被获取
- 线程饥饿: 多个线程同步访问线程资源,可能一直获取不到锁
- 排队自旋锁: 不会使线程状态发生切换,不会使线程进入阻塞状态,减少了不需要的上下文切换
- SpinLock
- SpinWait
- SleepEx 切换到任意逻辑核心关联的待运行队列中的线程
- 自旋锁不适用于长时间运行的操作
3.互斥锁
- 基于原子操作和线程调度 0表示未获取 1表示已被获取
- 失败不重试,进入等待队列 线程进入等待状态 等待唤醒
- Mutex
- WaitOne等待锁
- ReleaseMutex 释放锁
- Dispose 销毁锁
- pthread POSIX线程标准的类库
- 支持重入 递归锁
混合锁
获取锁失败后,重试一定的次数 失败超过一定的次数 进入等待状态 更通用 性能更好
- Monitor
- Enter
- Exit
- 线程锁:信号量 (数值记录可用的数量) = 线程同步对象
- 自习室中的座位
- 互斥锁L:某个座位是否被占用
- 信号量:整个自习室中未被占用的作为数量
- 信号量常用于实现生产消费模式
- 读写锁(读取锁、写入锁) = 混合锁 频繁读取并且读取需要一定时间的场景
- 多线程写入同一个文件
异步操作
表示执行某项操作后不等待操作结束,但可以在操作结束后收到通知