一个人需要两样东西

漫漫长夜, 一个深处异乡,每天在外学习iOS编程的我,这次又失眠了,而且失眠得很彻底,脑子里都是往事的回忆,还剩半年的大四生活, 该面对接下来学习完的就业问题. 都会感到特别的无助. 随着时间越久,身体越来越感到冰即便现在是初春, 凄凉的很透彻.其实自己来学习这么久,没有失眠过几次.但是可怕的是,每次失眠的都特别厉害.已经到这种地步了, 没事,亲爱的自己: 渐渐地让自己控制住自己, 对的一个人需要有两样东西, 你就会走的很远.

  第一: 你的目标. 对的,只要你知道你为什么而来, 想要达到什么样的目标, 那么你就不会在抱怨什么, 因为你知道抱怨是解决不了任何问题的.你需要的只是每天充实着,后来你会感谢现在你自己. 第二:需要一颗感恩的心, 去对待每天, 去对待你遇到的每个人.你要将自己放在最坏的环境, 假设灭有他们的帮助, 你可能不是现在的样子.这样, 你才会有持久的幸福感.
对于这个问题,我可以为您提供两种实现方式: 1. 信号量和 PV 操作实现: 首先,我们需要定义三个信号量:tobacco, paper, match表示三个吸烟者是否拥有自己需要的物品;supply表示供应者当前有没有放置物品在桌子上;agent_signal表示当前是哪个吸烟者需要抽烟。 每个吸烟者和供应者分别是一个进程,代码如下: // 初始化信号量 Semaphore tobacco(0); Semaphore paper(0); Semaphore match(0); Semaphore supply(0); Semaphore agent_signal(1); // 初始值为1表示让第一个吸烟者先抽烟 // 吸烟者1进程 void smoker1() { while (true) { tobacco.wait(); // 等待自己拥有烟草 supply.wait(); // 等待供应者放置物品 smoke(); // 吸烟 supply.signal(); // 唤醒供应者放置物品 } } // 吸烟者2进程 void smoker2() { while (true) { paper.wait(); // 等待自己拥有纸 supply.wait(); // 等待供应者放置物品 smoke(); // 吸烟 supply.signal(); // 唤醒供应者放置物品 } } // 吸烟者3进程 void smoker3() { while (true) { match.wait(); // 等待自己拥有火柴 supply.wait(); // 等待供应者放置物品 smoke(); // 吸烟 supply.signal(); // 唤醒供应者放置物品 } } // 供应者进程 void agent() { while (true) { agent_signal.wait(); // 等待当前需要抽烟的吸烟者 int items = rand() % 3; // 随机放置两个物品 switch (items) { case 0: // 放置烟草和纸 tobacco.signal(); paper.signal(); break; case 1: // 放置烟草和火柴 tobacco.signal(); match.signal(); break; case 2: // 放置纸和火柴 paper.signal(); match.signal(); break; } supply.signal(); // 通知吸烟者可以抽烟了 } } // 吸烟函数 void smoke() { // 这里可以加入一些表示吸烟的代码 agent_signal.signal(); // 通知供应者下一个需要抽烟的吸烟者 } 代码执行流程:首先供应者进程通过rand()函数随机生成两个物品,并通过semaphore类型的signal()函数唤醒两个需要这两个物品的吸烟者进程。一旦他们拥有了这些物品,就可以吸烟了。吸烟过程中,供应者进程等待吸烟者唤醒他,然后再生成下一组物品。这个过程一直循环。 2. 管程实现 这里我们用条件变量表示进程间需要等待某些条件满足的情况,以及互斥锁保证进程安全。 定义三个条件变量tobacco, paper, match和两个互斥锁table_mutex, smoke_mutex。tobacco代表烟草是否存在,paper代表纸是存在,match代表火柴是否存在;table_mutex用于保护在桌子上放置物品;smoke_mutex用于保证吸烟者不能同时抽烟。 每个吸烟者和供应者分别是一个进程,代码如下: // 定义静态变量 static bool tobacco_exist = false; static bool paper_exist = false; static bool match_exist = false; Condition tobacco; Condition paper; Condition match; Mutex table_mutex; Mutex smoke_mutex; // 吸烟者1进程 void smoker1() { while (true) { smoke_mutex.lock(); // 加锁 while (!tobacco_exist) { tobacco.wait(smoke_mutex); // 等待烟草存在 } table_mutex.lock(); // 加锁 tobacco_exist = false; // 取走烟草 table_mutex.unlock(); // 解锁 smoke_mutex.unlock(); // 解锁 smoke(); // 吸烟 } } // 吸烟者2进程 void smoker2() { while (true) { smoke_mutex.lock(); while (!paper_exist) { paper.wait(smoke_mutex); } table_mutex.lock(); paper_exist = false; table_mutex.unlock(); smoke_mutex.unlock(); smoke(); } } // 吸烟者3进程 void smoker3() { while (true) { smoke_mutex.lock(); while (!match_exist) { match.wait(smoke_mutex); } table_mutex.lock(); match_exist = false; table_mutex.unlock(); smoke_mutex.unlock(); smoke(); } } // 供应者进程 void agent() { while (true) { table_mutex.lock(); int items = rand() % 3; switch (items) { case 0: tobacco_exist = true; paper_exist = true; match_exist = false; tobacco.signal(); paper.signal(); break; case 1: tobacco_exist = true; paper_exist = false; match_exist = true; tobacco.signal(); match.signal(); break; case 2: tobacco_exist = false; paper_exist = true; match_exist = true; paper.signal(); match.signal(); break; } table_mutex.unlock(); } } // 吸烟函数 void smoke() { // 这里可以加入一些表示吸烟的代码 } 代码执行流程:供应者进程生成两个物品,并存储在变量中。在进程访问和修改变量时,加上了一个互斥锁table_mutex,确保各个进程的安全。然后通过条件变量tobacco、paper、match发送信号通知相应的吸烟者有需要的物品了。注意,吸烟者在等待物品的时候,需要将res_mutex加锁,等待到合适物品后释放res_mutex,抽完烟后再次获取res_mutex。同时,吸烟者在抽烟时,也需要将smoke_mutex加锁,确保各吸烟者不能同时抽烟。这个过程一直循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值