Pthread spinlock自旋锁

锁机制(lock) 是多线程编程中最经常使用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护。编程

Pthreads提供了多种锁机制,常见的有:
1) Mutex(互斥量):pthread_mutex_***
2) Spin lock(自旋锁):pthread_spin_***
3) Condition Variable(条件变量):pthread_con_***
4) Read/Write lock(读写锁):pthread_rwlock_***多线程

在多线程编中,根据应用场合的不一样,选择合适的锁来进行同步,对多线程程序的性能影响很是大. 本文主要对 pthread_mutex 和 pthread_spinlock 两种锁制机进行比较,并讨论其适用的场合.函数

1 Pthread mutex

Mutex属于sleep-waiting类型的锁. 从 2.6.x 系列稳定版内核开始, Linux 的 mutex 都是 futex (Fast-Usermode-muTEX)锁.
futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。它们第一次出如今内核开发的2.5.7版;其语义在2.5.40固定下来,而后在2.6.x系列稳定版内核中出现。
Futex 是由Hubertus Franke(IBM Thomas J. Watson 研究中心), Matthew Kirkwood,Ingo Molnar(Red Hat)和 Rusty Russell(IBM Linux 技术中心)等人建立的。
Futex 是由用户空间的一个对齐的整型变量和附在其上的内核空间等待队列构成. 多进程或多线程绝大多数状况下对位于用户空间的futex 的整型变量进行操做(汇编语言调用CPU提供的原子操做指令来增长或减小),而其它状况下,则须要经过代价较大的系统调用来对位于内核空间的等待队列进行操做(如唤醒等待的进程/线程,或 将当前进程/线程放入等待队列). 除了多个线程同时竞争锁的少数状况外,基于 futex 的 lock 操做是不须要进行代价昂贵的系统调用操做的.
.
这种机制的核心思想是经过将大多数状况下非同时竞争 lock 的操做放到在用户空间来执行,而不是代价昂贵的内核系统调用方式来执行,从而提升了效率.工具

Pthreads提供的Mutex锁操做相关的API主要有:
一、 pthread_mutex_lock (pthread_mutex_t *mutex);
二、 pthread_mutex_trylock (pthread_mutex_t *mutex);
三、 pthread_mutex_unlock (pthread_mutex_t *mutex);性能

由于源代码比较长,这里不作摘录,你们能够参考:
glibc-2.12.2/nptl/pthread_mutex_lock.cspa

2 Pthread spinlock

spinlock,也称自旋锁,是属于busy-waiting类型的锁.在多处理器环境中, 自旋锁最多只能被一个可执行线程持有。若是一个可执行线程试图得到一个被争用(已经被持有的)自旋锁,那么该线程就会一直进行忙等待,自旋,也就是空转,等待锁从新可用。若是锁未被争用,请求锁的执行线程便马上获得它,继续执行。线程

一个被争用的自旋锁使得请求它的线程在等待锁从新可用时自旋,特别的浪费CPU时间,因此自旋锁不该该被长时间的持有。实际上,这就是自旋锁的设计初衷,在短期内进行轻量级加锁。设计

Kernel中的自旋锁不可以在可以致使睡眠的环境中使用。举个例子,一个线程A得到了自旋锁L;这个时候,发生了中断,在对应的中断处理函数B中,也尝试得到自旋锁L,就会中断处理程序进行自旋。可是原先锁的持有者只有在中断处理程序结束后,采用机会释放自旋锁,从而致使死锁。
因为涉及到多个处理器环境下,spin lock的效率很是重要。由于在等待spin lock的过程,处理器只是不停的循环检查,并不执行其余指令。但即便这样, 通常来讲,spinlock的开销仍是比进程调度(context switch)少得多。这就是spin lock 被普遍应用在多处理器环境的缘由队列

Pthreads提供的与Spin Lock锁操做相关的API主要有:
pthread_spin_lock (pthread_spinlock_t *lock);
pthread_spin_trylock (pthread_spinlock_t *lock);
pthread_spin_unlock (pthread_spinlock_t *lock);进程

相关文章
相关标签/搜索