問題:オペレーティングシステムが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と関係がありますか?