用基础的c语言写生产者消费者问题
时间: 2023-10-16 13:09:19 浏览: 42
生产者消费者问题是多线程编程中一个经典的同步问题,下面是用基础的C语言实现的生产者消费者问题的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define N 10 // 缓冲区大小
#define M 10 // 生产者、消费者数量
int buffer[N]; // 缓冲区
int in = 0, out = 0; // 缓冲区的读写指针
sem_t mutex, empty, full; // 三个信号量,分别表示互斥、空、满
void *producer(void *arg) // 生产者线程函数
{
int id = *(int*)arg;
while (1) {
int item = rand() % 1000; // 生成一个产品
sem_wait(&empty); // 等待空缓冲区
sem_wait(&mutex); // 互斥地访问缓冲区
buffer[in] = item;
in = (in + 1) % N;
printf("producer %d produced item %d\n", id, item);
sem_post(&mutex); // 访问结束,释放缓冲区
sem_post(&full); // 发出产品,通知消费者
}
return NULL;
}
void *consumer(void *arg) // 消费者线程函数
{
int id = *(int*)arg;
while (1) {
int item;
sem_wait(&full); // 等待满缓冲区
sem_wait(&mutex); // 互斥地访问缓冲区
item = buffer[out];
out = (out + 1) % N;
printf("consumer %d consumed item %d\n", id, item);
sem_post(&mutex); // 访问结束,释放缓冲区
sem_post(&empty); // 消费产品,通知生产者
}
return NULL;
}
int main()
{
srand(1234);
sem_init(&mutex, 0, 1);
sem_init(&empty, 0, N);
sem_init(&full, 0, 0);
pthread_t threads[M];
int ids[M];
for (int i = 0; i < M; i++) {
ids[i] = i;
if (i % 2 == 0) {
pthread_create(&threads[i], NULL, producer, &ids[i]);
} else {
pthread_create(&threads[i], NULL, consumer, &ids[i]);
}
}
for (int i = 0; i < M; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
```
该程序使用三个信号量(互斥、空、满)来同步多个生产者、消费者线程对一个固定大小的缓冲区进行操作。在程序执行时,若有生产者线程发现缓冲区未满,则向缓冲区中添加一个随机的产品,否则等待缓冲区变为空闲状态。当有消费者线程发现缓冲区非空,则从缓冲区中取出一个产品进行消费,否则等待缓冲区变为非空状态。生产者和消费者线程之间通过信号量的 wait 和 post 操作进行同步。