插件窝 干货文章 linux锁有哪几种

linux锁有哪几种

线程 pthread 内核 作用 383    来源:    2025-05-03

在 Linux 系统中,锁(Lock)是并发控制的核心机制,主要用于解决多线程/多进程环境下的资源竞争问题。以下是 Linux 中常见的锁类型及其分类:


一、用户空间锁(User-space Locks)

主要用于多线程编程(如 POSIX 线程库 pthread)。

  1. 互斥锁(Mutex)

    • 作用:确保同一时间只有一个线程访问共享资源。
    • 特点
      • 阻塞式锁,未获取锁的线程会休眠。
      • 不可递归(同一线程重复加锁会导致死锁,除非使用 PTHREAD_MUTEX_RECURSIVE)。
    • APIpthread_mutex_init(), pthread_mutex_lock(), pthread_mutex_unlock()
  2. 自旋锁(Spinlock)

    • 作用:通过忙等待(Busy-waiting)实现轻量级同步。
    • 特点
      • 不休眠,适合短时间等待的高性能场景(如内核临界区)。
      • 用户态需谨慎使用(可能浪费 CPU 周期)。
    • APIpthread_spin_init(), pthread_spin_lock()
  3. 读写锁(Read-Write Lock)

    • 作用:区分读/写操作,允许多个读线程同时访问。
    • 特点
      • 写独占,读共享。
      • 适合读多写少的场景(如缓存)。
    • APIpthread_rwlock_init(), pthread_rwlock_rdlock(), pthread_rwlock_wrlock()
  4. 条件变量(Condition Variable)

    • 作用:线程间通知机制,需配合互斥锁使用。
    • 特点
      • 用于等待特定条件成立(如队列非空)。
    • APIpthread_cond_init(), pthread_cond_wait(), pthread_cond_signal()
  5. 屏障(Barrier)

    • 作用:同步多个线程,等待所有线程到达屏障点后再继续。
    • APIpthread_barrier_init(), pthread_barrier_wait()

二、内核空间锁(Kernel-space Locks)

Linux 内核提供的锁机制,部分也可通过系统调用供用户态使用。

  1. 原子操作(Atomic Operations)

    • 作用:通过 CPU 指令(如 x86LOCK 前缀)保证操作的原子性。
    • 示例atomic_t 类型,atomic_inc(), atomic_dec()
  2. 内核互斥锁(Kernel Mutex)

    • 类似用户态互斥锁,但支持更复杂的特性(如优先级继承)。
  3. 信号量(Semaphore)

    • 作用:控制对资源的访问数量(计数器)。
    • 分类
      • 二进制信号量(类似互斥锁)。
      • 计数信号量(允许有限并发)。
    • APIsem_init(), sem_wait(), sem_post()(用户态);内核态使用 struct semaphore
  4. RCU(Read-Copy-Update)

    • 作用:无锁读取,通过延迟写操作实现高性能。
    • 适用场景:读多写少,如内核路由表。
  5. 顺序锁(Seqlock)

    • 作用:通过版本号机制优化读操作(读不加锁,写独占)。
    • 适用场景:读频繁且写极少(如系统时间更新)。

三、文件锁(File Locks)

用于多进程间对文件的同步访问。

  1. 劝告锁(Advisory Lock)

    • 特点:依赖进程主动检查锁(非强制)。
    • APIfcntl()F_SETLK, F_GETLK)。
  2. 强制锁(Mandatory Lock)

    • 特点:内核强制阻止其他进程访问已锁文件。
    • 启用方式:文件系统挂载时设置 mand 选项。
  3. flock()

    • 作用:对整个文件加锁(粒度较粗)。
    • 特点:仅支持劝告锁。

四、其他同步机制

  1. Futex(Fast Userspace Mutex)

    • 作用:混合用户态和内核态的轻量级锁。
    • 原理:用户态尝试获取锁,失败时通过系统调用进入内核态休眠。
  2. 内存屏障(Memory Barrier)

    • 作用:防止 CPU 指令重排序,保证内存访问顺序(如 smp_rmb(), smp_wmb())。

选择锁的建议

  • 线程间同步:优先用 mutexrwlock
  • 短临界区:考虑 spinlock(但用户态慎用)。
  • 进程间同步:文件锁或共享内存+信号量。
  • 高性能读RCUseqlock(内核场景)。

通过合理选择锁类型,可以平衡性能与安全性。