在 Linux 系统中,实现线程同步有多种方式,每种方式适用于不同的场景。以下是主要的线程同步方法及其特点:
c
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex); // 加锁
pthread_mutex_unlock(&mutex); // 解锁
c
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
pthread_rwlock_rdlock(&rwlock); // 读锁
pthread_rwlock_wrlock(&rwlock); // 写锁
pthread_rwlock_unlock(&rwlock); // 解锁
c
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_cond_wait(&cond, &mutex); // 等待条件(需配合互斥锁)
pthread_cond_signal(&cond); // 唤醒一个等待线程
pthread_cond_broadcast(&cond); // 唤醒所有等待线程
c
pthread_spinlock_t spinlock;
pthread_spin_lock(&spinlock); // 自旋加锁
pthread_spin_unlock(&spinlock); // 解锁
c
pthread_barrier_t barrier;
pthread_barrier_init(&barrier, NULL, n_threads); // 初始化
pthread_barrier_wait(&barrier); // 等待同步
c
sem_t sem;
sem_init(&sem, 0, initial_value); // 初始化
sem_wait(&sem); // P操作(减1)
sem_post(&sem); // V操作(加1)
c
flock(fd, LOCK_EX); // 加排他锁
flock(fd, LOCK_UN); // 解锁
c
__sync_fetch_and_add(&counter, 1); // 原子加法
场景 | 推荐方式 |
---|---|
简单共享变量保护 | 互斥锁 |
读多写少 | 读写锁 |
等待条件触发 | 条件变量 + 互斥锁 |
极短临界区 | 自旋锁 |
多线程分阶段同步 | 屏障 |
控制资源池并发数 | 信号量 |
无锁高性能编程 | 原子操作 |
pthread_mutex_trylock
。PTHREAD_PROCESS_SHARED
属性。通过合理选择同步机制,可以平衡线程安全性与系统性能。