linux pin mutex锁

转载自: http://blog.csdn.net/hjffly/article/details/6969975


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

1. 互斥锁:pthread_mutex,属于sleep-waiting类型的锁

pthread_mutex_t *mutex;
int pthread_mutex_int(mutex, attr)    //以动态方式创建互斥锁,参数attr指定了新建互斥锁mutex的属性
int pthread_mutex_lock(mutex)   //加锁
int pthread_mutex_unlock(mutex)  //解锁

locak_irq_disable()、local_irq_enable()、local_irq_save()和local_irq_restore()为中断处理函数,主要是在要进入临界时禁止中断加在出临界区时使能中断。
locak_irq_disable()、local_irq_enable()配对使用,而local_irq_save()和local_irq_restore()配对使用。
locak_irq_disable()和local_irq_save()都可以禁止中断,但不同的是后者可以保存中断状态
local_irq_restore()在使能中断的同时还恢复了由local_irq_save()所保存的中断状态


2. 自旋锁:pin lock,属于busy-wait(忙等待)类型的锁
自旋锁与互斥锁的区别:自旋锁不会引起调用者睡眠,如果自旋锁已经被另的执行单元保持,调用者就一直循环在那里,看是否该自旋锁的保持者已经释放了锁,“自旋”一词而就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远高于互斥锁。
自旋锁的不足之处:
(1) 自旋锁一直占用CPU,它在未获得锁的情况下,一直运行-自旋,所以占用着CPU,如果不能在很短的时间内获得锁,这无疑会使CPU效率降低
(2) 在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数时也可能造成死锁,如copy_to_user()、copy_from_user()、kmalloc()等


因此要慎用自旋锁,自旋锁有在内核可抢占式或SMP的情况下才真正需要。

你可能感兴趣的:(linux pin mutex锁)