利用信号量 和进程 实现 生产者-消费者问题,c语言实现
时间: 2024-04-29 16:26:21 浏览: 143
信号量来解决操作系统的消费者与生产者问题.rar_信号量_生产者 消费者_进程
好的,下面是生产者-消费者问题的代码示例,利用信号量和进程来实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_BUFF_SIZE 10 // 缓冲区大小
#define MAX_PROD_NUM 20 // 生产者生产的最大数量
// 缓冲区
char buffer[MAX_BUFF_SIZE] = {0};
int in = 0, out = 0;
// 信号量
sem_t empty_sem; // 空槽位数量
sem_t full_sem; // 已填充槽位数量
sem_t mutex_sem; // 互斥信号量
// 生产者线程
void* producer(void* arg) {
int num = *(int*)arg;
for (int i = 0; i < num; i++) {
sem_wait(&empty_sem); // 获取空槽位
sem_wait(&mutex_sem); // 获取互斥权
buffer[in] = 'A' + i % 26;
printf("producer %lu: produce %c\n", pthread_self(), buffer[in]);
in = (in + 1) % MAX_BUFF_SIZE;
sem_post(&mutex_sem); // 释放互斥权
sem_post(&full_sem); // 填充一个槽位
sleep(1); // 等待一段时间
}
pthread_exit(NULL);
}
// 消费者线程
void* consumer(void* arg) {
int num = *(int*)arg;
for (int i = 0; i < num; i++) {
sem_wait(&full_sem); // 获取已填充槽位
sem_wait(&mutex_sem); // 获取互斥权
printf("consumer %lu: consume %c\n", pthread_self(), buffer[out]);
buffer[out] = 0;
out = (out + 1) % MAX_BUFF_SIZE;
sem_post(&mutex_sem); // 释放互斥权
sem_post(&empty_sem); // 释放一个空槽位
sleep(1); // 等待一段时间
}
pthread_exit(NULL);
}
int main() {
int prod_num = 6, cons_num = 4;
// 初始化信号量
sem_init(&empty_sem, 0, MAX_BUFF_SIZE);
sem_init(&full_sem, 0, 0);
sem_init(&mutex_sem, 0, 1);
// 创建生产者线程
pthread_t prod_tid, prod_tid2;
pthread_create(&prod_tid, NULL, producer, (void*)&prod_num);
pthread_create(&prod_tid2, NULL, producer, (void*)&prod_num);
// 创建消费者线程
pthread_t cons_tid, cons_tid2;
pthread_create(&cons_tid, NULL, consumer, (void*)&cons_num);
pthread_create(&cons_tid2, NULL, consumer, (void*)&cons_num);
// 等待线程结束
pthread_join(prod_tid, NULL);
pthread_join(prod_tid2, NULL);
pthread_join(cons_tid, NULL);
pthread_join(cons_tid2, NULL);
// 销毁信号量
sem_destroy(&empty_sem);
sem_destroy(&full_sem);
sem_destroy(&mutex_sem);
return 0;
}
```
代码说明:
1. 定义全局变量 `buffer` 作为缓冲区,变量 `in` 和 `out` 分别表示插入和读取缓冲区的位置。
2. 定义三个信号量 `empty_sem`, `full_sem`, `mutex_sem`,分别表示空槽位数量、已填充槽位数量和互斥信号量。
3. 在生产者和消费者函数中,使用 `sem_wait` 和 `sem_post` 操作信号量,来实现同步和互斥。
4. 程序中创建 2 个生产者线程和 2 个消费者线程,它们分别使用 `pthread_create` 函数创建,等待线程结束使用 `pthread_join` 函数。
5. 程序结束时使用 `sem_destroy` 函数销毁信号量。
这个程序使用了信号量和互斥信号量来解决生产者-消费者问题,保证了生产者和消费者之间的同步和互斥,可以避免竞态条件和死锁的问题。
阅读全文