用户态自旋锁、读写自旋锁及互斥锁

1、自旋锁

自旋锁最多可能被一个可执行线程所持有。一个被征用的自旋锁使得请求它的线程在等待锁重新可用时自旋(特别浪费处理器时间)。所以自旋锁不应该被长时间持有。

自旋锁是不可递归的!

1)自旋锁相关函数

       用户态的自旋锁相关函数包含在头文件

       相关函数:

       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)-写锁相关函数

用户态的读-写锁相关函数包含在头文件中。

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)互斥锁相关的函数

用户态的互斥锁相关函数包含在头文件中。

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);              //解锁

 自旋锁与互斥锁使用对比

需求

建议的加锁方法

低开销加锁

优先使用自旋锁

短期锁定

优先使用自旋锁

长期加锁

优先使用互斥锁

持有锁需要睡眠

使用互斥锁


你可能感兴趣的:(用户态自旋锁、读写自旋锁及互斥锁)