
并发锁
发布日期:2021-05-08 05:54:33
浏览次数:24
分类:精选文章
本文共 1203 字,大约阅读时间需要 4 分钟。
1. 互斥锁
互斥锁通过睡眠状态确保进程间的互斥。获取锁失败时,进程会进入睡眠态,等待内核调度重新唤醒。这种机制会导致线程切换,带有一定的开销。特点:获取锁失败会陷入睡眠,适用于互斥代码执行时间较长。
1.1 pthread_mutex_lock
使用 `pthread_mutex_lock` 获取锁时,进入互斥区间内执行操作。 ```c pthread_mutex_lock(&mxlock); ++val; pthread_mutex_unlock(&mxlock); ```1.2 pthread_mutex_trylock
`pthread_mutex_trylock` 不会阻塞,适用于自旋锁或互斥锁。 ```c pthread_mutex_trylock(&mxlock); while (pthread_mutex_trylock(&mxlock) != 0) { printf("pthread_mutex_trylock fail thread:%d\n", pthread_self()); } ++val; printf("i=%d\n", val); pthread_mutex_unlock(&mxlock); ```2. 自旋锁
自旋锁通过忙等待(busy waiting)实现加锁,使用 CAS 原子操作不断尝试获取锁,直到成功。不会导致线程切换。 ```c pthread_spin_lock(&spinlock); ++val; pthread_spin_unlock(&spinlock); ``` 特点:一直占用 CPU,适用于互斥代码执行时间较短。3. 读写锁
读写锁允许多个线程同时读取,但写入时互斥。获取锁失败时进入睡眠状态。特点:保证读并发,写互斥。获取锁失败进入睡眠。
3.1 读优先
读优先锁允许读线程优先获取锁,写线程可能因饥饿问题而长时间等待。可能导致写线程饥饿,一直有读请求到来,导致写获取不到锁。
3.2 写优先
写优先锁允许写线程优先获取锁,读线程可能因饥饿问题而长时间等待。可能造成读饥饿,读线程长时间无法获取锁。
3.3 公平锁
通过队列机制,按顺序处理读写请求,避免了饥饿问题。特点:读写操作入队列,按顺序获取锁,解决了饥饿问题。
4. 悲观锁
悲观锁假设共享资源的访问会导致冲突,在访问前必须加锁。包括互斥锁、自旋锁、读写锁等。特点:在多线程下,共享资源容易发生冲突。
5. 乐观锁
乐观锁假设共享资源的冲突概率较低,先修改资源再验证冲突。适用于冲突概率小的场景。特点:多线程下,共享资源很少发生冲突,先修改后验证。虽然无锁,但增加了重试成本。
6. CAS
CAS(Compare-and-Swap)是通过硬件指令实现的原子操作,用于实现自旋锁和其他互斥机制。特点:通过 CPU 硬件指令实现互斥资源的原子操作。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月03日 10时23分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
结构型设计在工作中的一些经验总结
2019-03-04
如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了!
2019-03-04
OpenAI Gym简介及初级实例
2019-03-04
Java面向对象
2019-03-04
JAVA带标签的break和continue
2019-03-04
Java获取线程基本信息的方法
2019-03-04
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
2019-03-04
紫书——蛇形填数
2019-03-04
A Guide to Node.js Logging
2019-03-04
webwxbatchgetcontact一个神奇的接口
2019-03-04
【考研英语-基础-简单句】简单句的核心变化_谓语情态
2019-03-04
仿小米商城(上)
2019-03-04
HTML 和 CSS 简单实现注册页面
2019-03-04
(SpringMVC)springMVC.xml 和 web.xml
2019-03-04
1.2.3 项目、项目集、项目组合以及运营管理之间的关系
2019-03-04
【△重点△】LeetCode - 4. 寻找两个正序数组的中位数——二分查找
2019-03-04
二分查找与插入排序的结合使用
2019-03-04
892 三维形体的表面积(分析)
2019-03-04
279 完全平方数(bfs)
2019-03-04
875 爱吃香蕉的珂珂(二分查找)
2019-03-04