并发与竞态

自旋锁

自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:

  • 自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。
  • 在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

用法

spinlock_t rtc_lock;
spin_lock_init(&rtc_lock);//每个驱动都会事先初始化,只需要这一次初始化
    
spin_lock_irq(&rtc_lock);
//临界区
spin_unlock_irq(&rtc_lock);

信号量

内核中的信号量通常用作mutex互斥体(信号量初值初始化为1就达到了互斥的效果)

  • 如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择

使用情景对比

需求 建议的加锁方法
低开销加锁 优先使用自旋锁
短期锁定 优先使用自旋锁
长期加锁 优先使用信号量
中断上下文中加锁 使用自旋锁
持有锁是需要睡眠、调度 使用信号量
  • 分不清楚就用mutex

你可能感兴趣的:(并发与竞态)