0

問題:オペレーティングシステムが2つのスレッド間でラウンドロビンを実行せず、システムがハングするだけです。

私たちのシステムは、IIS / W2008R264ビット用のc++のHTTPネイティブコードモジュールとして実装されています。シナリオ:

  • リクエスト1がWebサーバーに到着します。新しいスレッド(t1)がIISによって開始されます。スレッドは実行中です。

  • リクエスト2は、リクエスト1が終了する前に到着します。IISは新しいスレッド(t2)を開始します。このスレッドは、共有リソースが使用可能になるのを待つループに入ります。この動作は私たちによるプログラムです。スレッド2(t2)はループに入るので、CPUの100%を消費し始めます。

問題:オペレーティングシステムが2つのスレッド間でラウンドロビンを実行せず、システムがハングするだけです。実行を最初のスレッドに切り替えると、共有リソースが解放され、2番目のスレッドも実行される可能性があります。

さらに見知らぬ人:この動作は、マシンが1CPUの場合にのみ発生します。マシンに別のCPUを追加すると、それは完全に機能し、期待どおりに2つのスレッドを切り替えます。何もハングしません。

CPUが1つしかない場合に機能する回避策(およびより優れたプログラミング)は、共有リソースの可用性を確認するときに「sleep(100)」をループに入れることです。

CPUが1つしかないのに、オペレーティングシステムが2つのスレッド間でラウンドロビンを実行しないのはなぜですか?VMWareと関係がありますか?

4

1 に答える 1

1

このスレッドは、共有リソースが利用可能になるのを待っているループに入ります

これは物事を同期する間違った方法のように思えます。OS がコンテキスト スイッチを実行するためのヒントを取得できるように、スレッド間でシグナリングを行う必要があります。

于 2013-01-15T09:23:06.950 に答える