生产者消费者问题C语言代码
时间: 2023-09-05 22:05:35 浏览: 156
### 回答1:
对于生产者消费者问题的C语言代码,可以使用线程和互斥锁来实现。
以下是一种可能的实现方式:
```c
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0; // 当前缓冲区中元素的数量
int in = 0; // 生产者插入元素的位置
int out = 0; // 消费者取出元素的位置
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
int i;
for (i = 0; i < BUFFER_SIZE * 2; i++) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
buffer[in] = i;
in = (in + 1) % BUFFER_SIZE;
count++;
printf("生产者生产了 %d\n", i);
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void *consumer(void *arg) {
int i, value;
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&full, &mutex);
}
value = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
printf("消费者消费了 %d\n", value);
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
}
}
int main(int argc, char *argv[]) {
pthread_t prod, cons;
pthread_create(&prod, NULL, producer, NULL);
pthread_create(&cons, NULL, consumer, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
return 0;
}
```
在这个代码中,我们定义了一个大小为10的缓冲区 `buffer`,一个计数器 `count` 来记录缓冲区中元素的数量,以及两个索引 `in` 和 `out` 分别表示生产者插入元素的位置和消费者取出元素的位置。
我们使用了线程和互斥锁来控制并发访问缓冲区的问题。在 `producer` 函数中,我们首先使用 `pthread_mutex_lock` 函数获取互斥锁,然后使用 `while` 循环来等待缓冲区中有空闲位置。当缓冲区中有空闲位置时,我们将一个元素插入到缓冲区中,并且更新 `in`、`count` 等变量。然后,我们发送一个信号给等待在 `empty` 条件变量上的线程,表示缓冲区中有数据可供消费。最后,我们释放互斥锁。
在 `consumer` 函数中,我们也使用了互斥锁和条件变量来等待缓冲区中有数据可供消费。当缓冲区中有数据可供消费时,我们取出一个元素,并且更新 `out
### 回答2:
生产者消费者问题是经典的并发编程问题,描述了多个生产者和多个消费者共同访问一个有界缓冲区的情况。以下是一个使用C语言实现的简化版本代码:
```c
#include <stdio.h>
#include <pthread.h>
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
int count = 0;
int in = 0;
int out = 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 item;
while (1) {
item = produce_item(); // 产生一个数据项
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE)
pthread_cond_wait(¬_full, &mutex);
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
count++;
pthread_cond_signal(¬_empty);
pthread_mutex_unlock(&mutex);
}
}
void *consumer(void *arg) {
int item;
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0)
pthread_cond_wait(¬_empty, &mutex);
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
pthread_cond_signal(¬_full);
pthread_mutex_unlock(&mutex);
consume_item(item); // 消费一个数据项
}
}
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;
}
```
以上代码中,生产者线程通过`produce_item()`函数产生一个数据项,然后将数据项放入缓冲区,当缓冲区已满时会阻塞等待。消费者线程通过`consume_item()`函数从缓冲区取出一个数据项进行消费,当缓冲区为空时会阻塞等待。通过互斥锁和条件变量的配合,实现了生产者和消费者的正确同步与互斥操作。
### 回答3:
生产者消费者问题是一个经典的线程同步问题,在多线程环境下,生产者线程负责生产产品,消费者线程负责消费产品。为了保证线程的安全并避免不正确的操作,我们需要使用互斥锁(mutex lock)和条件变量(condition variable)来进行线程间的同步。
下面是一个用C语言编写的生产者消费者问题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 5 // 缓冲区大小
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 缓冲区的写指针
int out = 0; // 缓冲区的读指针
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t not_full; // 缓冲区不满的条件变量
pthread_cond_t not_empty; // 缓冲区不空的条件变量
void *producer(void *param) {
while (1) {
pthread_mutex_lock(&mutex);
while ((in + 1) % BUFFER_SIZE == out) { // 缓冲区已满,等待缓冲区不满的条件变量
pthread_cond_wait(¬_full, &mutex);
}
int item = rand() % 100; // 生产一个随机数
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer produced item: %d\n", item);
pthread_cond_signal(¬_empty); // 发送缓冲区不空的条件变量信号
pthread_mutex_unlock(&mutex);
}
}
void *consumer(void *param) {
while (1) {
pthread_mutex_lock(&mutex);
while (in == out) { // 缓冲区为空,等待缓冲区不空的条件变量
pthread_cond_wait(¬_empty, &mutex);
}
int item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer consumed item: %d\n", item);
pthread_cond_signal(¬_full); // 发送缓冲区不满的条件变量信号
pthread_mutex_unlock(&mutex);
}
}
int main() {
pthread_t producer_thread, consumer_thread;
// 初始化互斥锁和条件变量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(¬_full, NULL);
pthread_cond_init(¬_empty, NULL);
// 创建生产者和消费者线程
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
// 主线程等待线程结束
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
// 销毁互斥锁和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(¬_full);
pthread_cond_destroy(¬_empty);
return 0;
}
```
以上是一个基于生产者消费者问题的简单示例代码,它通过互斥锁和条件变量来实现线程间的同步和控制。它能够保证在多线程环境下,生产者和消费者线程的正确执行和互不干扰。
阅读全文