生产者和消费者问题(单一生产者和单一消费者)

题目一:一组生产者和一组消费者进程共享一个初始为空,大小为n的缓冲区,只有缓冲区没有满的时候,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区未空时,消费者才可以从中取出消息,否则必须等待。由于缓冲区是临界资源,所必须互斥访问。

关系分析:

1.生产者和消费者对缓冲区的访问是互斥关系;

2.生产和消费者又有着同步关系,必须先生产再消费。

信号量设置:

1.设置mutex作为互斥信号量,让生产者和消费者可以互斥地访问缓冲区,且初始值为1;

2.设置信号量full来表示非空缓冲区的个数,初始值为0;信号量empty来表示空闲缓冲区的个数,初始值为n。

在写代码之前,要明确同步和互斥的代码有什么不同。

1.首先,生产者生产了数据消费者才能消费,所以用full信号量来控制生产者和消费者的这层同步关系,也就是在生产者进程的末尾要加上V(full),在消费者进程取走数据之前需要P(full)。

2.用信号量empty来控制生产者最多只可以往缓冲区中放入n个数据,超过n个数据,生产者进程就会被阻塞。

(在没写这篇博客之前,一直认为只需要full和empty这两个信号量中的一个就行,写到这里就明白了为什么一定要设置两个信号量了)

下面是对生产者和消费者问题的代码描述: 


                
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是符合要求的Java代码: ```java public class User { private String name; private String password; private String email; public User(String name, String password, String email) { this.name = name; this.password = password; this.email = email; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } public void setEmail(String email) { this.email = email; } public String getName() { return name; } public String getPassword() { return password; } public String getEmail() { return email; } public boolean login(String name, String password) { if (!validateName(name) || !validatePassword(password)) { return false; } return name.equals(this.name) && password.equals(this.password); } private boolean validateName(String name) { return name != null && name.length() >= 6; } private boolean validatePassword(String password) { if (password == null || password.length() < 6) { return false; } boolean hasLetter = false; boolean hasNumber = false; for (char c : password.toCharArray()) { if (Character.isDigit(c)) { hasNumber = true; } else if (Character.isLetter(c)) { hasLetter = true; } } return hasLetter && hasNumber; } } ``` 代码中的User类负责保存用户的属性并提供相应的访问方法,以及提供登录功能。登录时需要检查用户名和密码是否符合要求,并验证是否与当前User对象的属性相匹配。用户名和密码的校验规则在类的内部实现,与外部代码无关,符合单一职责原则。同时,也保证了类的封装性和代码的可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值