编写c程序,在visual studio环境下解决经典进程同步问题:生产者消费者问题。 具体要求: 定义生产者数量为1,消费者数量为1,二者者异步执行。 定义缓冲区长度为5。 其中,生产者一共生产20次。 记录生产消费过程,并打印。
时间: 2024-12-20 11:21:57 浏览: 16
在Visual Studio环境中解决经典生产者消费者问题,我们可以使用互斥量(mutex)、条件变量(condition variable)和信号量(semaphore)。这里是一个简单的C程序示例,它实现了单生产者单消费者的模型:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 5
#define MAX_PRODUCERS 1
#define MAX_CONSUMERS 1
int buffer[BUFFER_SIZE] = {0};
int items_produced = 0;
int items_consumed = 0;
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t cond; // 条件变量
int producer_flag = 1; // 生产者标志
int consumer_flag = 1; // 消费者标志
void *producer(void *arg) {
while (items_produced < 20) {
pthread_mutex_lock(&mutex);
if (!items_produced && producer_flag) {
printf("Producer %d produced item %d\n", MAX_PRODUCERS, items_produced++);
buffer[items_produced % BUFFER_SIZE] = items_produced;
if (items_produced == BUFFER_SIZE) {
printf("Buffer full, producer waiting...\n");
pthread_cond_signal(&cond); // 醒通知消费者
pthread_mutex_unlock(&mutex);
pthread_join(NULL, NULL); // 等待消费者处理满队列
producer_flag = 0;
} else {
pthread_cond_signal(&cond); // 醒通知消费者
}
pthread_mutex_unlock(&mutex);
} else {
printf("Producer waiting for space...\n");
pthread_cond_wait(&cond, &mutex);
}
}
printf("Producer done.\n");
return NULL;
}
void *consumer(void *arg) {
while (items_consumed < items_produced) {
pthread_mutex_lock(&mutex);
if (!items_consumed && consumer_flag) {
printf("Consumer %d consumed item %d\n", MAX_CONSUMERS, items_consumed++);
buffer[items_consumed % BUFFER_SIZE] = 0; // 消费者处理完后清空
items_produced--;
if (items_produced == 0) {
printf("Buffer empty, consumer waiting...\n");
pthread_cond_signal(&cond); // 醒通知生产者
pthread_mutex_unlock(&mutex);
pthread_join(NULL, NULL); // 等待生产者填充满队列
consumer_flag = 0;
} else {
pthread_cond_signal(&cond); // 醒通知生产者
}
pthread_mutex_unlock(&mutex);
} else {
printf("Consumer waiting for item...\n");
pthread_cond_wait(&cond, &mutex);
}
}
printf("Consumer done.\n");
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
if (pthread_create(&producer_thread, NULL, producer, NULL) || pthread_create(&consumer_thread, NULL, consumer, NULL)) {
perror("Error creating threads");
exit(1);
}
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
运行这个程序,你会看到生产者和消费者交替工作,直到所有物品都被生产并消费完毕。注意这只是一个简化版的例子,实际应用中可能需要更复杂的数据结构和错误处理。
阅读全文