
6.1 自旋锁:轻量级但别滥用自旋锁,说白了就是“忙等”。线程拿不到锁就在那原地打转,不断检查锁状态。好处是开销极小,没有上下文切换。坏处是浪费CPU。适用场景:临界区极小,持锁时间极短(微秒级)。比如更新一个硬件寄存器、修改一个共享标志位。// 自旋锁典型用法 spinlock_t my_lock; spin_lock_init(my_lock); spin_lock(my_lock); // 临界区:极短的操作 hw_reg-status = 1; spin_unlock(my_lock);注意:自旋锁持有期间不能睡眠!不能调用可能引起调度的函数(如kmalloc、copy_from_user)。我在项目中遇到过有人自旋锁里调了printk,结果printk内部有锁,直接死锁。血的教训。我个人习惯,自旋锁只用在中断上下文或持锁时间明确小于一次调度开销的场景。超过几十微秒的操作,就别用自旋锁了。6.2 互斥锁:重量级但更安全互斥锁(mutex)是“睡等”。拿不到锁的线程会主动让出CPU,进入睡眠状态,等锁释放了再被唤醒。代价是上下文切换,开销比自旋锁大得多。适用场景:临界区较大,持锁时间较长(毫秒级或更长)。比如处理数据缓冲区、等待硬件操作完成。// 互斥锁典型用法 struct mutex my_mutex; mutex_init(my_mutex); mutex_lock(my_mut