插件窝 干货文章 linux 什么是临界区

linux 什么是临界区

临界 lock 线程 互斥 77    来源:    2025-04-28

Linux中的临界区(Critical Section)

临界区是指访问共享资源(如全局变量、共享内存、设备寄存器等)的代码段,这些资源在同一时间只能被一个线程或进程访问,以避免竞态条件(Race Condition)的发生。

临界区的主要特点

  1. 互斥访问:任何时候只能有一个执行线程进入临界区
  2. 有限等待:任何请求进入临界区的线程应该在有限时间内获得许可
  3. 无忙等待:当临界区不可用时,等待线程不应持续占用CPU资源

Linux中保护临界区的机制

1. 原子操作

atomic_t v = ATOMIC_INIT(0);
atomic_inc(&v);  // 原子增加

2. 自旋锁(Spinlock)

spinlock_t lock = SPIN_LOCK_UNLOCKED;
spin_lock(&lock);
// 临界区代码
spin_unlock(&lock);

3. 互斥锁(Mutex)

struct mutex lock;
mutex_init(&lock);
mutex_lock(&lock);
// 临界区代码
mutex_unlock(&lock);

4. 信号量(Semaphore)

struct semaphore sem;
sema_init(&sem, 1); // 初始值为1的二元信号量
down(&sem);
// 临界区代码
up(&sem);

5. 读写锁(RW Lock)

rwlock_t lock = RW_LOCK_UNLOCKED;
read_lock(&lock);
// 只读临界区
read_unlock(&lock);

write_lock(&lock);
// 读写临界区
write_unlock(&lock);

选择适当的同步机制

  • 短期锁定:自旋锁(适用于持有锁时间很短的情况)
  • 用户上下文:互斥锁(可以睡眠时使用)
  • 读多写少:读写锁
  • 简单计数器:原子操作

临界区编程注意事项

  1. 保持临界区尽可能短小
  2. 避免在临界区内调用可能引起阻塞的函数
  3. 注意死锁问题(避免嵌套锁定)
  4. 考虑性能影响,选择适当的同步机制

临界区的正确管理是多线程/多进程编程中的核心问题,对系统稳定性和性能有重大影响。