多线程实验生产者消费者linux,多线程编程之:实验内容——“生产者消费者”实验...
时间: 2023-06-16 17:07:08 浏览: 215
生产者-消费者问题是操作系统中的一个经典问题,也是多线程编程中常见的问题。在该问题中,有两类线程:生产者和消费者。生产者线程负责生产产品,将产品放入一个缓冲区中;消费者线程负责消费产品,从缓冲区中取出产品并进行消费。而缓冲区则是两个线程共享的资源。
下面是一个Linux下的多线程生产者-消费者示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 生产者将产品放入缓冲区的位置
int out = 0; // 消费者从缓冲区取出产品的位置
int count = 0; // 缓冲区中产品的数量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t not_full = PTHREAD_COND_INITIALIZER; // 条件变量,缓冲区不满
pthread_cond_t not_empty = PTHREAD_COND_INITIALIZER; // 条件变量,缓冲区不空
// 生产者线程函数
void *producer(void *arg) {
int i;
for (i = 0; i < BUFFER_SIZE * 2; i++) { // 生产BUFFER_SIZE * 2个产品
pthread_mutex_lock(&mutex); // 加锁
while (count == BUFFER_SIZE) { // 缓冲区已满,等待条件变量not_full
pthread_cond_wait(¬_full, &mutex);
}
buffer[in] = i; // 生产产品
printf("producer: produced item %d at %d\n", buffer[in], in);
in = (in + 1) % BUFFER_SIZE; // 更新in指针
count++; // 更新产品数量
pthread_cond_signal(¬_empty); // 发送条件变量not_empty
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
// 消费者线程函数
void *consumer(void *arg) {
int i;
for (i = 0; i < BUFFER_SIZE * 2; i++) { // 消费BUFFER_SIZE * 2个产品
pthread_mutex_lock(&mutex); // 加锁
while (count == 0) { // 缓冲区为空,等待条件变量not_empty
pthread_cond_wait(¬_empty, &mutex);
}
printf("consumer: consumed item %d from %d\n", buffer[out], out);
out = (out + 1) % BUFFER_SIZE; // 更新out指针
count--; // 更新产品数量
pthread_cond_signal(¬_full); // 发送条件变量not_full
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
// 创建生产者线程和消费者线程
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
// 等待两个线程结束
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
在该示例中,使用了一个互斥锁和两个条件变量来保证线程之间的同步。生产者线程按照顺序生成产品并将产品放入缓冲区,当缓冲区已满时,生产者线程等待条件变量not_full;消费者线程按照顺序从缓冲区中取出产品并进行消费,当缓冲区为空时,消费者线程等待条件变量not_empty。通过条件变量的使用,可以避免线程的忙等待,提高了程序的效率。
阅读全文