编写C程序,利用多线程实现生产者-消费者问题,生产者和消费者分别在2个线程中,生产者生产的产品放在链表的表头上,消费者从表头取走产品。
时间: 2024-05-06 12:18:35 浏览: 86
以下是利用多线程实现生产者-消费者问题的C程序:
```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_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 条件变量
void *producer(void *args) {
int i;
for (i = 1; i <= BUFFER_SIZE; i++) {
pthread_mutex_lock(&mutex); // 加锁
while (count == BUFFER_SIZE) { // 如果缓冲区已满,等待消费者消费
printf("producer: buffer is full, waiting ...\n");
pthread_cond_wait(&cond, &mutex);
}
buffer[count++] = i; // 生产产品
printf("producer: produce product %d\n", i);
pthread_cond_signal(&cond); // 通知消费者可以消费
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
void *consumer(void *args) {
int i, product;
for (i = 1; i <= BUFFER_SIZE; i++) {
pthread_mutex_lock(&mutex); // 加锁
while (count == 0) { // 如果缓冲区为空,等待生产者生产
printf("consumer: buffer is empty, waiting ...\n");
pthread_cond_wait(&cond, &mutex);
}
product = buffer[--count]; // 消费产品
printf("consumer: consume product %d\n", product);
pthread_cond_signal(&cond); // 通知生产者可以生产
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;
}
```
在上面的程序中,`producer()`函数和`consumer()`函数分别是生产者线程和消费者线程的入口函数。它们都使用了互斥锁和条件变量来实现同步。具体来说,生产者在生产产品之前先加锁,如果缓冲区已满,则等待消费者消费;否则,将产品放到缓冲区的表头上,通知消费者可以消费,然后解锁。消费者在消费产品之前也先加锁,如果缓冲区为空,则等待生产者生产;否则,从缓冲区表头取出产品进行消费,通知生产者可以生产,然后解锁。最后,主线程等待生产者线程和消费者线程结束,程序结束运行。
阅读全文