この質問はElectronicArtsインタビューで尋ねられました。異なる範囲を印刷する3つのスレッドを使用してソートされた順序で番号を印刷
スレッドが3つあります。最初のスレッドは1〜10の数字を出力します。 2番目のスレッドは11から20までの数値を出力し、3番目のスレッドは21から30までの数値を出力します。しかし、数字は1,11,2,21,12などのように不規則な順序で印刷されます。
数字を1、2などのソート順で印刷したい場合はどうすればいいですか? ?
この質問はElectronicArtsインタビューで尋ねられました。異なる範囲を印刷する3つのスレッドを使用してソートされた順序で番号を印刷
スレッドが3つあります。最初のスレッドは1〜10の数字を出力します。 2番目のスレッドは11から20までの数値を出力し、3番目のスレッドは21から30までの数値を出力します。しかし、数字は1,11,2,21,12などのように不規則な順序で印刷されます。
数字を1、2などのソート順で印刷したい場合はどうすればいいですか? ?
3つのスレッドが数字を印刷するために使用する1つの静的メソッドは、ロックして、すでに印刷された番号を確認し、印刷できるようになったら印刷して移動します。
スレッドがサスペンドできる共有条件オブジェクトを使用します。状態は0,1,2の3つの状態のいずれかになります。状態は状態0で初期化されます.1-10スレッドは状態0に関連付けられ、11-20状態は状態1に関連付けられ、最後のスレッドは状態0に関連付けられます。各スレッドは、開始時に状態をチェックし、状態がスレッドと関連付けられている状態と異なる場合、その状態をサスペンドします。一度に1つのスレッドのみが実行され、その範囲を印刷できます。スレッドはその範囲を表示すると、状態の状態をインクリメントし、スレッドが待機しているのを目覚めさせて終了します。これは問題を解決するはずです。
スレッドがサスペンドできない場合は、3つのスレッドの「順序付けられたスケジューリング」を表す共有オブジェクトをポーリングします。
もう1つのアプローチは、スレッドをチェーン化することです。第1のスレッドが終了するまでブロックするスレッドを持ち、2番目のスレッドが終了するまでブロックします。このソリューションは共有オブジェクトを必要としませんが、各スレッドはその前身を知る必要があります
barrierのための自然のようです。 3つのプロセス、2つの障壁(barrier10
とbarrier20
と呼ぶ)。
工程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
Sleepsort? :)(http://dis.4chan.org/read/prog/1295544154) –
同期についてはどうですか? – Nobody