C语言:生产者-消费者问题、读者-写者问题

本文介绍了C语言中使用信号量解决生产者-消费者和读者-写者问题。在生产者-消费者问题中,通过empty、full和mutex信号量确保线程同步。测试数据描述了线程的角色、开始时间和持续时间。读者-写者问题则要求读写操作互斥,同时实现了读者优先和写者优先的策略,测试数据同样包括线程角色、开始时间和持续时间。
摘要由CSDN通过智能技术生成

1.生产者-消费者问题:

题目要求
• 在 6.6.1 小节中,使用了三个信号量: empty (以记录有多少空位)、full
(以记录有多少满位)以及 mutex (二进制信号量或互斥信号量,以保
护对缓冲插入与删除的操作)。对于本项目, empty 与 full 将采用标
准计数信号量,而 mutex 将采用二进制信号量。生产者与消费者作
为独立线程,在 empty、full、mutex 的同步前提下,对缓冲进行插
入与删除。
• 本项目,可采用 Pthread 。

测试文件格式
测试数据文件包括 n 行测试数据,分别描述创建的 n 个线程是生产者还
是消费者,以及生产者或消费者存放或取产品的开始时间和持续时间。
每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个
正整数,表示线程序号。第二字段表示相应线程角色,P 表示生产者,
C 表示消费者。第三字段为一个正数,表示存放或取出操作的开始时间:
线程创建后,延迟相应时间(单位为秒)后发出对共享资源的使用申请。
第四字段为一个正数,表示操作的持续时间。第五字段为一个正数(仅
生产者有),表示生产的产品号。当线程申请成功后,开始对共享资源的
操作,该操作持续相应时间后结束,并释放共享资源。

# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <sys/types.h>
# include <pthread.h>
# include <semaphore.h>
# include <string.h>

# define BUFFER_SIZE 10

// 定义线程执行函数传入的参数格式
struct p {
    int id; // 线程的编号
    int num; // 产品
    int runtime; // 运行的时间
    int sleeptime; // 延迟发出请求的时间
};

int buffer[BUFFER_SIZE+1]; // 缓冲区的定义
int front = 0, rear = 0; // 标识头尾指针
sem_t mutex, empty, full; // 本项目需要用到的信号量

// 生产者生产元素
// @param item 生产的值
int insertItem(int item) {
    if ((rear+1)%(BUFFER_SIZE+1) == front) return 1;
    buffer[rear] = item;
    rear = (rear+1)%(BUFFER_SIZE+1);
    return 0;
}

// 消费者消费元素
// @param 用于存放消费者的产品
int removeItem(int* item) {
    if (front == rear) return 1;
    *item = buffer[front];
    front = (front+1) % (BUFFER_SIZE+1);
    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值