条件变量和互斥锁有什么区别?
时间: 2025-01-18 11:03:13 浏览: 54
条件变量和互斥锁都是多线程编程中用于同步和互斥的机制,但它们有不同的用途和特点。
1. **互斥锁(Mutex)**:
- **用途**:互斥锁用于保护共享资源,确保同一时间只有一个线程可以访问共享资源。
- **工作原理**:当一个线程获取到互斥锁后,其他线程必须等待,直到该线程释放互斥锁。
- **使用场景**:适用于保护短时间的临界区,确保对共享资源的原子访问。
2. **条件变量(Condition Variable)**:
- **用途**:条件变量用于线程间的通信,允许一个线程等待特定条件成立,而另一个线程在条件满足时通知等待的线程。
- **工作原理**:线程在条件变量上等待(wait)时,会释放互斥锁并进入阻塞状态,直到其他线程在条件变量上发出信号(signal)或广播(broadcast),唤醒等待的线程。
- **使用场景**:适用于需要线程间同步和等待特定条件的场景,如生产者-消费者问题。
### 区别
- **功能不同**:互斥锁用于保护共享资源,防止竞争条件;条件变量用于线程间的通信和同步。
- **使用方式不同**:互斥锁通过加锁和解锁来保护临界区;条件变量通过等待和信号机制来实现线程间的同步。
### 示例
```c
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int count = 0;
void* producer(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
count++;
printf("Produced: %d\n", count);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
void* consumer(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&cond, &mutex);
}
printf("Consumed: %d\n", count);
count--;
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
int main() {
pthread_t prod_thread, cons_thread;
pthread_create(&prod_thread, NULL, producer, NULL);
pthread_create(&cons_thread, NULL, consumer, NULL);
pthread_join(prod_thread, NULL);
pthread_join(cons_thread, NULL);
return 0;
}
```
在这个示例中,生产者线程通过互斥锁保护共享资源`count`,并在满足条件时通过条件变量通知消费者线程。消费者线程在条件不满足时等待条件变量。
阅读全文
相关推荐




















