2011-08-16 45 views
3

この質問はElectronicArtsインタビューで尋ねられました。異なる範囲を印刷する3つのスレッドを使用してソートされた順序で番号を印刷

スレッドが3つあります。最初のスレッドは1〜10の数字を出力します。 2番目のスレッドは11から20までの数値を出力し、3番目のスレッドは21から30までの数値を出力します。しかし、数字は1,11,2,21,12などのように不規則な順序で印刷されます。

数字を1、2などのソート順で印刷したい場合はどうすればいいですか? ?

+3

Sleepsort? :)(http://dis.4chan.org/read/prog/1295544154) –

+0

同期についてはどうですか? – Nobody

答えて

0

3つのスレッドが数字を印刷するために使用する1つの静的メソッドは、ロックして、すでに印刷された番号を確認し、印刷できるようになったら印刷して移動します。

3

スレッドがサスペンドできる共有条件オブジェクトを使用します。状態は0,1,2の3つの状態のいずれかになります。状態は状態0で初期化されます.1-10スレッドは状態0に関連付けられ、11-20状態は状態1に関連付けられ、最後のスレッドは状態0に関連付けられます。各スレッドは、開始時に状態をチェックし、状態がスレッドと関連付けられている状態と異なる場合、その状態をサスペンドします。一度に1つのスレッドのみが実行され、その範囲を印刷できます。スレッドはその範囲を表示すると、状態の状態をインクリメントし、スレッドが待機しているのを目覚めさせて終了します。これは問題を解決するはずです。

スレッドがサスペンドできない場合は、3つのスレッドの「順序付けられたスケジューリング」を表す共有オブジェクトをポーリングします。

もう1つのアプローチは、スレッドをチェーン化することです。第1のスレッドが終了するまでブロックするスレッドを持ち、2番目のスレッドが終了するまでブロックします。このソリューションは共有オブジェクトを必要としませんが、各スレッドはその前身を知る必要があります

1

barrierのための自然のようです。 3つのプロセス、2つの障壁(barrier10barrier20と呼ぶ)。

工程1:

Print 1-10 
Wait on barrier10 
Wait on barrier20 
Exit 

工程2:

Wait on barrier10 
Print 11-20 
Wait on barrier20 
Exit 

工程3:

Wait on barrier10 
Wait on barrier20 
Print 21-30 
Exit 
関連する問題