生活知识集
第二套高阶模板 · 更大气的阅读体验

线程同步机制常见手段详解

发布时间:2025-12-09 17:51:21 阅读:271 次

线程同步机制常见手段详解

在现代计算机系统中,多线程编程已经成了提升程序效率的常用方式。就像厨房里多个厨师同时准备一道大餐,如果没人协调,可能你拿刀我占灶,最后反而耽误时间。线程之间共享资源时也一样,必须通过同步机制来避免“抢资源”带来的混乱。

互斥锁(Mutex)

互斥锁是最基础的同步工具,它保证同一时刻只有一个线程能访问某个资源。比如银行取款机,同一张卡不能同时在两台机器上操作,系统会用锁来确保操作的独占性。

在代码中,通常通过加锁和解锁来控制:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_lock(&lock);
// 操作共享数据
shared_data++;
pthread_mutex_unlock(&lock);

信号量(Semaphore)

信号量像是一个计数器,用来管理多个线程对有限资源的访问。比如停车场有10个车位,信号量初始值设为10,每进一辆车减1,出去一辆加1,满的时候其他车就得等。

二进制信号量其实就相当于互斥锁,而计数信号量能支持更多并发场景。

#include <semaphore.h>
sem_t sem;
sem_init(&sem, 0, 3); // 允许最多3个线程同时访问

sem_wait(&sem);
// 执行临界区代码
do_something();
sem_post(&sem);

条件变量(Condition Variable)

有时候线程需要等某个条件成立才能继续,比如快递员要等包裹入库后才配送。条件变量就是用来实现这种“等待-通知”机制的。

它通常和互斥锁配合使用,让线程在条件不满足时进入等待状态,而不是不断轮询浪费资源。

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int ready = 0;

pthread_mutex_lock(&mutex);
while (!ready) {
pthread_cond_wait(&cond, &mutex);
}
// 条件满足,继续执行
pthread_mutex_unlock(&mutex);

自旋锁(Spinlock)

自旋锁和互斥锁类似,但它的策略是“不停询问”而不是“先睡着等叫醒”。适用于锁持有时间非常短的场景,比如操作系统内核中的某些操作。

虽然省去了线程切换的开销,但如果等待时间长,就会白白消耗CPU资源,像一个人站在门口一直敲门不停,直到别人开门。

读写锁(Read-Write Lock)

有些数据多数时候只是被读取,比如天气预报信息。读写锁允许多个线程同时读,但写的时候必须独占。这样既能保证安全,又能提高并发性能。

就像图书馆里多人可以同时查看一本书的内容,但只要有人想修改书页,其他人就得等他改完。