用c写一个使用信号量解决生产者消费者问题
时间: 2024-05-11 10:17:10 浏览: 16
好的,这里是一个使用信号量解决生产者消费者问题的C语言代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
#define NUM_PRODUCERS 5
#define NUM_CONSUMERS 5
int buffer[BUFFER_SIZE];
int buffer_index = 0;
sem_t full_sem, empty_sem, mutex_sem;
void *producer(void *arg) {
int *id = (int *)arg;
for (int i = 0; i < 10; i++) {
sem_wait(&empty_sem);
sem_wait(&mutex_sem);
buffer[buffer_index++] = i;
printf("Producer %d produced %d\n", *id, i);
sem_post(&mutex_sem);
sem_post(&full_sem);
}
return NULL;
}
void *consumer(void *arg) {
int *id = (int *)arg;
for (int i = 0; i < 10; i++) {
sem_wait(&full_sem);
sem_wait(&mutex_sem);
int item = buffer[--buffer_index];
printf("Consumer %d consumed %d\n", *id, item);
sem_post(&mutex_sem);
sem_post(&empty_sem);
}
return NULL;
}
int main() {
sem_init(&full_sem, 0, 0);
sem_init(&empty_sem, 0, BUFFER_SIZE);
sem_init(&mutex_sem, 0, 1);
pthread_t producers[NUM_PRODUCERS], consumers[NUM_CONSUMERS];
int producer_ids[NUM_PRODUCERS], consumer_ids[NUM_CONSUMERS];
for (int i = 0; i < NUM_PRODUCERS; i++) {
producer_ids[i] = i;
pthread_create(&producers[i], NULL, producer, &producer_ids[i]);
}
for (int i = 0; i < NUM_CONSUMERS; i++) {
consumer_ids[i] = i;
pthread_create(&consumers[i], NULL, consumer, &consumer_ids[i]);
}
for (int i = 0; i < NUM_PRODUCERS; i++) {
pthread_join(producers[i], NULL);
}
for (int i = 0; i < NUM_CONSUMERS; i++) {
pthread_join(consumers[i], NULL);
}
sem_destroy(&full_sem);
sem_destroy(&empty_sem);
sem_destroy(&mutex_sem);
return 0;
}
```
在这个示例中,我们使用了三个信号量:`full_sem`、`empty_sem`和`mutex_sem`。`full_sem`表示当前可消费的项目数量,`empty_sem`表示当前可生产的项目数量,`mutex_sem`用于保证在对缓冲区进行修改时只有一个线程访问。
在`producer`函数中,我们首先等待`empty_sem`信号量,以确保缓冲区中有空间可以进行生产。然后,我们等待`mutex_sem`信号量,以确保只有一个线程可以访问缓冲区。我们在缓冲区中添加一个项目,然后释放`mutex_sem`和`full_sem`信号量,以允许其他线程访问缓冲区。
在`consumer`函数中,我们首先等待`full_sem`信号量,以确保缓冲区中有可消费的项目。然后,我们等待`mutex_sem`信号量,以确保只有一个线程可以访问缓冲区。我们从缓冲区中删除一个项目,然后释放`mutex_sem`和`empty_sem`信号量,以允许其他线程访问缓冲区。
在`main`函数中,我们首先初始化信号量,然后创建生产者和消费者线程。我们使用`pthread_join`等待线程完成,然后销毁信号量。
这是一个基本的使用信号量解决生产者消费者问题的示例,您可以根据需要进行修改和扩展。