创建多个(不少于5个)进程或者线程模拟生产者和消费者
时间: 2024-02-15 20:02:55 浏览: 21
以下是使用多个线程模拟生产者和消费者的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 5
#define NUM_PRODUCERS 3
#define NUM_CONSUMERS 2
int buffer[BUFFER_SIZE];
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
int in = 0;
int out = 0;
void *producer(void *arg) {
int i, item;
for (i = 0; i < 10; i++) {
item = rand();
sem_wait(&empty); // 等待空缓冲区
pthread_mutex_lock(&mutex); // 加锁
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer %d: produced item %d\n", *(int *)arg, item);
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&full); // 发信号量通知消费者
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < 10; i++) {
sem_wait(&full); // 等待满缓冲区
pthread_mutex_lock(&mutex); // 加锁
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer %d: consumed item %d\n", *(int *)arg, item);
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&empty); // 发信号量通知生产者
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t tid_producer[NUM_PRODUCERS], tid_consumer[NUM_CONSUMERS];
sem_init(&empty, 0, BUFFER_SIZE); // 初始化信号量
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
int producer_id[NUM_PRODUCERS], consumer_id[NUM_CONSUMERS];
int i;
for (i = 0; i < NUM_PRODUCERS; i++) {
producer_id[i] = i + 1;
pthread_create(&tid_producer[i], NULL, producer, &producer_id[i]); // 创建生产者线程
}
for (i = 0; i < NUM_CONSUMERS; i++) {
consumer_id[i] = i + 1;
pthread_create(&tid_consumer[i], NULL, consumer, &consumer_id[i]); // 创建消费者线程
}
for (i = 0; i < NUM_PRODUCERS; i++) {
pthread_join(tid_producer[i], NULL); // 等待线程结束
}
for (i = 0; i < NUM_CONSUMERS; i++) {
pthread_join(tid_consumer[i], NULL);
}
sem_destroy(&empty); // 销毁信号量和互斥锁
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在上面的代码中,我们创建了3个生产者线程和2个消费者线程,模拟了多个生产者和消费者同时操作缓冲区的情况。在生产者线程中,我们通过传递生产者的ID参数来区分不同的生产者,方便输出调试信息。在主函数中,我们使用循环分别创建生产者和消费者线程,并且等待所有线程结束后再销毁信号量和互斥锁。
注意,以上代码只是示例代码,实际生产者和消费者可能需要更加复杂的逻辑和数据结构来实现。另外,多线程编程需要保证线程安全,需要合理地使用锁和信号量等同步机制来避免线程间的竞争和冲突。