互斥锁mutex 条件变量con_t 举例子
时间: 2023-10-06 07:10:58 浏览: 111
假设有一个生产者-消费者模型,多个线程同时访问共享的缓冲区。为了保证线程安全,可以使用互斥锁和条件变量来协调线程之间的操作。
在这个模型中,互斥锁用于保护共享资源,防止多个线程同时访问同一个资源。当一个线程需要访问共享资源时,需要先获取互斥锁,如果互斥锁已经被其他线程占用,那么当前线程将会被阻塞,直到互斥锁被释放。
下面是一个简单的示例代码:
```c++
#include <iostream>
#include <pthread.h>
#include <queue>
using namespace std;
queue<int> q;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* producer(void* arg) {
int count = 0;
while (count < 10) {
pthread_mutex_lock(&mutex);
q.push(count++);
cout << "Producer: produced " << count - 1 << endl;
pthread_cond_signal(&cond); // 发送信号给消费者线程
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* consumer(void* arg) {
while (true) {
pthread_mutex_lock(&mutex);
if (q.empty()) {
pthread_cond_wait(&cond, &mutex); // 等待信号
}
int value = q.front();
q.pop();
cout << "Consumer: consumed " << value << endl;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, producer, NULL);
pthread_create(&tid2, NULL, consumer, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
```
在这个示例中,生产者线程不断向队列中添加数据,每次添加完毕后发送一个信号给消费者线程,通知它们可以消费数据了。消费者线程在收到信号后,从队列中取出数据进行处理。如果队列为空,消费者线程将会等待信号,直到有新的数据可以消费。
在这个模型中,互斥锁保护了队列的访问,条件变量用于在生产者和消费者之间传递信号。通过互斥锁和条件变量的协作,可以有效地保证多线程程序的正确性和性能。
阅读全文