条件变量和信号量都是Linux中用于线程同步的机制,但它们在设计目的和使用方式上有显著区别:
特性 | 条件变量 | 信号量 |
---|---|---|
基本用途 | 用于线程间的条件等待和通知 | 用于控制对共享资源的访问 |
关联机制 | 必须与互斥锁配合使用 | 可以独立使用 |
计数器 | 无内置计数器 | 有内置计数器 |
唤醒机制 | 可广播通知所有等待线程 | 每次释放只唤醒一个等待线程 |
所属标准 | POSIX线程标准(pthread) | System V和POSIX都有实现 |
pthread_cond_signal()
:唤醒至少一个等待线程pthread_cond_broadcast()
:唤醒所有等待线程c
pthread_mutex_lock(&mutex);
while (condition_is_false) {
pthread_cond_wait(&cond, &mutex);
}
// 执行操作
pthread_mutex_unlock(&mutex);
sem_wait()
:如果信号量值>0则减1,否则阻塞sem_post()
:信号量值加1,唤醒一个等待线程c
sem_wait(&sem); // 获取资源
// 访问共享资源
sem_post(&sem); // 释放资源
条件变量适用于:
信号量适用于:
选择使用哪种机制取决于具体的同步需求和性能考虑。