欢迎光临散文网 会员登陆 & 注册

秒杀多线程-PV操作

2023-03-20 21:36 作者:ベ计院小白隆ミ  | 我要投稿

PV操作由P操作原语和V操作原语组成(原语也叫原子操作Atomic Operation,是不可中断的过程),对信号量(注意不要和Windows中的信号量机制相混淆)进行操作,具体定义如下:

P(S):

1.将信号量S的值减1,即S=S-1;

2.如果S>=0,则该进程继续执行;否则该进程置为等待状态。


V(S):

1.将信号量S的值加1,即S=S+1;

2.该进程继续执行;如果该信号的等待队列中有等待进程就唤醒一等待进程。

用PV操作实现多线程的同步与互斥是非常简单的,只要考虑逻辑处理上合理严密而不用考虑具体技术细节,因此与写伪代码较为相似。比如有多个进程P1、P2、 ……PN。它们要互斥的访问一个资源。用PV操作来实现就非常方便直观。下面是PV操作代码:

设置信号量为S,初值为1。各进程的操作流程如下:

进程P1

P(S);

访问资源;

V(S);


进程P2

P(S);

访问资源;

V(S);

...

进程Pn

P(S);

访问资源;

V(S);


可以看出PV操作会忽略具体的编程细节,让程序员的主要精力放在线程同步互斥的逻辑处理上。因此,通过练习PV操作能快速有效提高程序员对多线程的逻辑思维能力,达到强化“内功”的目的。

放水果

桌上有一空盘,允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

分析问题:

1.爸爸等待盘子空

2.儿子等待盘中水果是桔子

3.女儿等待盘中水果是苹果

可以看出没有互斥资源。先设置三个信号量,信号量Orange表示盘中有桔子,初值为0。信号量Apple表示盘中有苹果,初值为0。信号量EmptyDish表示盘子为空,初值为1。三个人的操作流程如下所示:

1.爸爸

2.儿子

3.女儿

安全岛

在南开大学至天津大学间有一条弯曲的路,每次只允许一辆自行车通过,但中间有小的安全岛M(同时允许两辆车),可供两辆车在已进入两端小车错车,设计算法并使用P,V实现。

分析问题:

1.从N到T出发的人需要等到上个出发的人到达T且道路K上没有人,从T到N的也类似

2.道路K和L上只能有一辆自行车行驶

分析之后,下面就用PV原语给出答案(考研辅导书上的答案):

设置信号量NT表示在路口N且从N到T方向上允许出发的自行车数量,初值为1。信号量TN表示在路口T且从T到N方向上允许出发的自行车数量,初值为1。信号量K和L表示道路,初值均为1。这样从N到T的车和从T到N的车的行驶流程如下:

这个题目的解法有很多,比如还可以用信号量M来记录安全岛M上空位个数,初值为2。每个进入道路前的人都要先预订安全岛上的空位,订到后再互斥的进入道路。否则就要等待安全岛上有空位。信号量K和L表示道路,初值均为1。然后从N到T的车和从T到N的车的行驶流程如下:


参考:https://blog.csdn.net/morewindows/article/details/7650470


秒杀多线程-PV操作的评论 (共 条)

分享到微博请遵守国家法律