编程实现生产者-消费者问题的模拟c语言代码
时间: 2024-06-11 13:10:16 浏览: 106
C语言编程模拟生产者和消费者问题(附代码程序).pdf
5星 · 资源好评率100%
以下是一个使用互斥锁和条件变量模拟生产者-消费者问题的C语言代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.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 full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
void *producer(void *arg)
{
int item;
while (1) {
item = rand() % 100; // 生产一个随机数
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
count++;
printf("Producer produced %d\n", item);
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
sleep(1); // 等待一段时间后再次生产
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int item;
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&full, &mutex);
}
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
printf("Consumer consumed %d\n", item);
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
sleep(2); // 等待一段时间后再次消费
}
pthread_exit(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;
}
在这个代码中,生产者线程和消费者线程都是一个死循环,分别生产和消费数据。当缓冲区已满时,生产者线程会等待条件变量empty,当缓冲区为空时,消费者线程会等待条件变量full。当生产者生产数据时,会通过pthread_cond_signal函数发送信号给消费者线程,告诉它们可以消费数据了。当消费者消费数据时,会通过pthread_cond_signal函数发送信号给生产者线程,告诉它们可以生产数据了。
在这个代码中,互斥锁mutex用于保护共享资源buffer和count。当线程需要访问这些资源时,必须先获取互斥锁,以避免竞争条件。如果互斥锁已经被其他线程获取,那么线程就会阻塞,直到互斥锁被释放。
阅读全文