两人过独木桥

两人过独木桥

“团结就是力量!”

我终于从一个事例上,看到了这句话的真正含义:

有一个比赛项目,比赛规则是这样的:

每组派一名选手,两个人同时上一个只能一个人通过的独木桥上。不但要顺利让自己通过,而且还要阻止对方通过,才能算赢。而有一组选手的做法令全场的人震惊!

他们是这样做的:

两个人同时上了独木桥,走到一起时,抱住了对方,然后两人迅速而小心地交换了位置,都顺利通过了独木桥,双方毫发无损。

这组选手的举动,惊动了在场所有的观众、裁判员和其他选手,大家都在热烈讨论他们的做法。

这种做法,到底对还是错呢?到底该给那一对得分呢?是算双赢呢?还是算作弊呢?

比赛结束后,经过大家的讨论,结果出来了。

大家一致决定,给两队都得分,也就是属于双赢。

这个故事让我觉得,有些事情不能只靠蛮力,而要动脑子解决问题,不一定非要争个你死我活,而可以想一个两全其美的办法。那样不就不会再有争执了吗?

有一句话说的是:一根筷子易折,一把筷子难折。

只要团结起来,不但能避免战争,还能让双方都满意!

比如说,其他选手不是你死就是我亡,有意思吗?

还不如上面两组选手,想到了一个两全其美的办法,各自为队伍争得了一分,还为自己“争得了一分”!

脑子,在什么时候都要用到运动。

如果,生活中的点点滴滴你都不会动脑子解决,而只是靠蛮力或是靠他人的话,那比赛结果会是怎样的呢?那,不就更不行了吗?

我相信,这个道理大家都懂,只是有的时候会忘记或做不到。就好比这个小故事,很多人,都没有想到这个办法吧!

可是,这组选手就想到了,他们可能是事先就商量好,不得罪他人,也不得罪自己,而是想到这种两全其美的方法,有备而来。

在比赛场上大显身手,做出的举动才惊天动地!

我觉得,大家都应该具备这种精神、性格和做法,在我们不管是学习生涯还是做人的路上,是绝对有帮助的。

让我们行动起来,在我们的人生道路上,留下多姿和多彩!

 

第二篇:独木桥

假定有如下独木桥问题:过桥时,同一方向的行人可连续过桥,当某一方有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。试用信号量机制解决。

(1) 需要设置几个信号量?分别是互斥信号量还是同步信号量?初值设为多少?并说明设置它们的意义。

(2) 写出用信号量机制解决此问题的算法。

答案:

(1) 将独木桥的两个方向分别标记为A和B。用整型变量countA和countB分别表示A、B方向上已在独木桥上的行人数。初值为0。需要设置三个初值都为1的互斥信号量:SA用来实现对countA的互斥访问,SB用来实现对countB的互斥访问,mutex用来实现对独木桥的互斥使用。

(2)

A方向行人过桥:

Begin

P(SA);

countA=countA+1;

if (countA= =1)

P(mutex);

V(SA);

过桥;

P(SA);

countA=countA-1;

if(countA= =0)

V(mutex);

V(SA);

End

B方向行人过桥:

Begin

P(SB);

countB=countB+1;

if (countB= =1)

P(mutex);

V(SB);

过桥;

P(SB);

countB=countB-1;

if(countB= =0)

V(mutex);

V(SB);

End

用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)

目的: 通过研究Linux的线程机制和信号量实现睡眠理发师问题(Sleeping-Barber Problem)的并发控制。

说明:设有一个理发师,5把椅子(另外还有一把理发椅),几把椅子可用连续存储单元。

要求;

(1) 每个顾客进入理发室后,即时显示“Entered” 及其线程标识,还同时显示理发室共有几名顾客及其所坐的位置。

(2) 至少有10个顾客,每人理发至少3秒钟。

(3) 多个顾客须共享操作函数代码。

问题分析

题目中要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。当理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师看报,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量 mutex用于互斥,初值为1

问题实现

1.PV操作代码如下:

int waiting=0 ; //等候理发的顾客数

int chairs=n; //为顾客准备的椅子数

semaphore customers=0, barbers=0,mutex=1;

barber()

{

while(TRUE); //理完一人,还有顾客吗?

P(cutomers); //若无顾客,理发师睡眠

P(mutex); //进程互斥

waiting := waiting – 1; //等候顾客数少一个

V(barbers); //理发师去为一个顾客理发

V(mutex); //开放临界区

cut-hair( ); //正在理发}

customer()

{

P(mutex); //进程互斥

if (waiting)

{ waiting := waiting+1; // 等候顾客数加1

V(customers); //必要的话唤醒理发师

V(mutex); //开放临界区

P(barbers); //无理发师, 顾客坐着养神

get-haircut( ); //一个顾客坐下等理/ }

else

V(mutex); //人满了,走吧!}

相关推荐