1

sleepスレッドが実行の途中で、メインスレッドによって可能である他のスレッドによって配置されるとどうなりますか?

私が関数を持っていると仮定しますProducerConsumer sleep()1つのユニットの生産の途中でプロデューサーがいる場合はどうなりますか?

ユニットが半分生産されていると仮定します。そして、sleep()を実行します。システムの整合性に問題がある可能性があります

4

4 に答える 4

3

呼び出されたスレッドsleepは、スレッドスケジューラによってアイドルキューに入れられ、実行中のCPUからコンテキストスイッチアウトされるため、他のスレッドが代わりに使用できます。

すべてのコンテキスト(レジスタ、スタックポインタ、ベースポインタなど)はスレッドスタックに保存されるため、次回実行するときに、中断したところから続行できます。

OSは、システムが複数のことを実行しているように見せるために、スレッド間でコンテキストスイッチを常に実行しています。OSスレッドスケジューラアルゴリズムがそれを処理します。

スレッドのスケジューリングとスレッド化は大きなテーマです。本当に理解したいのであれば、それを読み始めることをお勧めします。:)

編集:sleep推奨されていないスレッド同期の目的で使用する場合は、適切な同期メカニズムを使用して、スレッドに他のスレッドを待機するように指示する必要があります。

于 2012-06-15T16:24:01.690 に答える
0

あるスレッドが別のスレッドの実行を強制的かつ同期的に妨害することはお勧めできません。あるスレッドが別のスレッドに非同期メッセージを送信して、何らかの方法で自分自身のスケジュールを変更するように要求することもできますが、それは、適切な状態にあるときに他のスレッドによって処理されます。

スレッドセーフなチャネルを使用して通信すると仮定すると、スリープ状態のスレッドが最終的にウェイクアップしてタスクキューからデータを取得するか、セマフォが設定されていることを確認してprodcedデータを読み取るため、問題は発生しません。

スレッドが不揮発性変数または状態を変更する直接関数呼び出しを使用して通信する場合、それは悪いことが発生するときです。

于 2012-06-15T16:26:11.443 に答える
0

スレッドがスリープしている間に一部の状態が変更されない限り、これに関連する問題はありません。そのため、スレッドはスリープする前とは異なる値のセットでウェイクアップします。

スレッドは常にCPUによって実行の切り替えが行われますが、データの競合やその他のバグが存在しないと仮定すると、実行の全体的な結果には影響しません。

于 2012-06-15T16:29:20.470 に答える
0

あるスレッドが別のスレッドを強制的にスリープさせる方法がわかりません。2つのスレッドが共有リソースにアクセスしている場合(Produce / Consumerの例では、入力/出力キューのように思われます)、両方のスレッドが同じロックを争う可能性があります。競合が「trylock」の種類でない場合、負けたスレッドは他のスレッドがロックを解放するのを待つ必要があります。待機しているスレッドは、ロックに関連付けられた待機キューに入れられ、スケジューラーの実行キューから削除されます。勝者のスレッドがロックを解放すると、コードはキューをチェックして、それを取得するのをまだ待機しているスレッドがあるかどうかを確認します。存在する場合は、1つが勝者として選択され、ロックが与えられ、スケジューラー実行キューに配置されます。

于 2012-06-15T16:31:42.677 に答える