用c写一个互斥锁和条件变量实现线程间通信
时间: 2024-02-09 16:13:00 浏览: 82
好的,以下是一个使用互斥锁和条件变量实现线程间通信的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE]; // 共享缓冲区
int count = 0; // 缓冲区中元素个数
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t cond; // 条件变量
void *producer(void *arg)
{
int item = 0;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
if (count == BUFFER_SIZE) { // 缓冲区已满,等待消费者消费
pthread_cond_wait(&cond, &mutex);
}
buffer[count++] = item++; // 生产一个物品,放入缓冲区
printf("Producer produces item %d\n", item);
pthread_mutex_unlock(&mutex); // 解锁
pthread_cond_signal(&cond); // 唤醒一个等待的消费者
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int item = 0;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
if (count == 0) { // 缓冲区为空,等待生产者生产
pthread_cond_wait(&cond, &mutex);
}
item = buffer[--count]; // 消费一个物品,从缓冲区中取出
printf("Consumer consumes item %d\n", item);
pthread_mutex_unlock(&mutex); // 解锁
pthread_cond_signal(&cond); // 唤醒一个等待的生产者
}
pthread_exit(NULL);
}
int main()
{
pthread_t producer_tid, consumer_tid;
// 初始化互斥锁和条件变量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
// 创建生产者和消费者线程
pthread_create(&producer_tid, NULL, producer, NULL);
pthread_create(&consumer_tid, NULL, consumer, NULL);
// 等待线程结束
pthread_join(producer_tid, NULL);
pthread_join(consumer_tid, NULL);
// 销毁互斥锁和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
```
在上面的示例代码中,我们使用了一个缓冲区来实现生产者和消费者之间的通信。生产者将生产的物品放入缓冲区,消费者从缓冲区中取出物品进行消费。当缓冲区已满时,生产者会等待消费者消费;当缓冲区为空时,消费者会等待生产者生产。在等待的过程中,使用条件变量来进行线程的阻塞和唤醒。当生产者放入一个物品时,会唤醒一个等待的消费者;当消费者取出一个物品时,会唤醒一个等待的生产者。同时,使用互斥锁来保护共享缓冲区的访问,确保线程安全。
阅读全文