概述
1、自旋锁
自旋锁最多可能被一个可执行线程所持有。一个被征用的自旋锁使得请求它的线程在等待锁重新可用时自旋(特别浪费处理器时间)。所以自旋锁不应该被长时间持有。
自旋锁是不可递归的!
(1)自旋锁相关函数
用户态的自旋锁相关函数包含在头文件<pthread.h>中。
相关函数:
int pthread_spin_destroy(pthread_spinlock_t *lock);
销毁自旋锁lock,并且回收被锁lock使用的任何资源。
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
分配使用自旋锁lock所需要的资源,并且初始化锁lock为未锁状态。
int pthread_spin_lock(pthread_spinlock_t *lock);
锁住自旋锁lock。当锁没有被某个线程持有时,调用的线程将获得锁,否则线程将不断自旋,知道锁可用。
int pthread_spin_trylock(pthread_spinlock_t *lock);
如果锁没有被某个线程持有,自旋锁lock将被锁住,否则将会失败。
int pthread_spin_unlock(pthread_spinlock_t *lock);
释放被锁住的自旋锁lock。
(2)基本使用形式
pthread_spin_init(&lock, 0);
…
pthread_spin_lock(&lock);
/*临界区资源…*/
pthread_spin_unlock(&lock);
pthread_spin_destroy(&lock);
真正需要保护的是数据而不是代码,采用特定的锁保护自己的共享数据。
2、读-写自旋锁
有时,锁的用途可以明确分为读取和写入两个场景。对一个链表可能既要更新又要检索。当更新(写入)连宝石,不能有其他代码并发地写或者读链表,写操作要求完全的护持。另一方面,当对其检索(读取)链表时,只要求其他程序不对链表进行写操作就行了,可以有多个并发的读操作。类似于这种情况,就可以通过读-写锁进型保护。
这种锁的机制照顾写要多一点,因此,非常适用于读操作远多于写操作的场景,能提高效率。
(1)读-写锁相关函数
用户态的读-写锁相关函数包含在头文件<pthread.h>中。
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr); //初始化锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //加读锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); //加写锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); //解锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); //销毁锁
读-写自旋锁的基本使用形式跟自旋锁差不多。
3、互斥锁
互斥锁说白了就是一种互斥的排他锁-——好比允许睡眠的自旋锁。
(1)互斥锁相关的函数
用户态的互斥锁相关函数包含在头文件<pthread.h>中。
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr); //初始化锁
int pthread_mutex_lock(pthread_mutex_t *mutex); //加锁
int pthread_mutex_unlock(pthread_mutex_t *mutex); //解锁
int pthread_mutex_destroy(pthread_mutex_t *mutex); //销毁锁
(2)基本使用形式
pthread_mutex_init(&mutex);
pthread_mutex_lock(&mutex); //加锁
/*临界区…*/
pthread_mutex_unlock(&mutex); //解锁
自旋锁与互斥锁使用对比
需求 | 建议的加锁方法 |
低开销加锁 | 优先使用自旋锁 |
短期锁定 | 优先使用自旋锁 |
长期加锁 | 优先使用互斥锁 |
持有锁需要睡眠 | 使用互斥锁 |
最后
以上就是含糊冬瓜为你收集整理的用户态自旋锁、读写自旋锁及互斥锁的全部内容,希望文章能够帮你解决用户态自旋锁、读写自旋锁及互斥锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复