多线程下锁的总结
来源:互联网 发布:浏览器连接不上网络 编辑:程序博客网 时间:2024/05/21 19:27
互斥锁(mutexlock):
最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程睡眠等待锁释放时被唤醒
自旋锁(spinlock):
同样用来标记只能有一个线程访问该对象,在同一线程多次加锁操作会造成死锁;使用硬件提供的swap指令或test_and_set指令实现;同互斥锁不同的是在锁操作需要等待的时候并不是睡眠等待唤醒,而是循环检测保持者已经释放了锁,这样做的好处是节省了线程从睡眠状态到唤醒之间内核会产生的消耗,在加锁时间短暂的环境下这点会提高很大效率
读写锁(rwlock):
高级别锁,区分读和写,符合条件时允许多个线程访问对象。处于读锁操作时可以允许其他线程和本线程的读锁, 但不允许写锁, 处于写锁时则任何锁操作都会睡眠等待;常见的操作系统会在写锁等待时屏蔽后续的读锁操作以防写锁被无限孤立而等待,在操作系统不支持情况下可以用引用计数加写优先等待来用互斥锁实现。 读写锁适用于大量读少量写的环境,但由于其特殊的逻辑使得其效率相对普通的互斥锁和自旋锁要慢一个数量级;值得注意的一点是按POSIX标准 在线程申请读锁并未释放前本线程申请写锁是成功的,但运行后的逻辑结果是无法预测
递归锁(recursivelock):
严格上讲递归锁只是互斥锁的一个特例,同样只能有一个线程访问该对象,但允许同一个线程在未释放其拥有的锁时反复对该锁进行加锁操作; windows下的临界区默认是支持递归锁的,而linux下的互斥量则需要设置参数PTHREAD_MUTEX_RECURSIVE_NP,默认则是不支持
1.递归锁:
递归锁,就是在同一线程上该锁是可重入的,对于不同线程则相当于普通的互斥锁。
PTHREAD_MUTEX_RECURSIVE_NP互斥量类型允许同一线程在互斥量解锁之前对该互斥量进行多次加锁。同一个递归互斥量维护锁的计数,在解锁的次数和加锁次数不同的情况下不会释放锁。即对同一互斥量加几次锁就要解几次锁。
设置锁为递归锁:pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
- 多线程下锁的总结
- 多线程下oci编程的总结教训
- HashMap多线程操作下的问题总结
- lunux下多线程总结
- 多线程总结下
- Java多线程总结(8)concurrent.locks包下的锁机制的使用
- 多线程下file的锁
- 关于win32环境下多线程编程的总结
- 总结: linux下的多线程API (POSIX线程)
- 总结: linux下的多线程API (POSIX线程)(转)
- 有关linux下多进程与多线程的区别总结
- linux下多线程编程总结
- 多线程的一些总结
- 多线程的总结
- 多线程的函数总结
- 多线程的总结
- 多线程的个人总结
- 多线程实现的总结
- String、StringBuffer与StringBuilder之间区别
- ?走投无路, 勾引了有夫之妇
- 275. H-Index II
- 【转载】调用dede:sql,dede:php标签 调用文章的静态链接地址
- dede根据当前栏目id换栏目图,不存在就用默认的。。
- 多线程下锁的总结
- type=image和type=submit的区别
- HTTP Content-type 常用对照表
- 一周讲座活动后的领悟
- php限制文件下载速度代码
- php常用正则表达式
- 最常用的PHP正则表达式收集整理
- linux下Apache服务器配置虚拟域名
- 解决PHP超大文件下载,断点续传下载的方法详解