適切な質問
シングルコアマシンでこの例外を経験した人はいますか?
The I/O operation has been aborted because of either a thread exit or an application request.
いくつかのコンテキスト
シングル CPU システムでは、スレッドに関係なく、一度に 1 つの MSIL 命令のみが実行されます。操作の合間に、ランタイムはハウスキーピングを行います。
2 つ目の CPU (または 2 つ目のコア) を導入すると、ランタイムがハウスキーピングを行っている間に操作を実行できるようになります。その結果、単一の CPU マシンで完全に機能するコードが、マルチコア環境で実行されるとクラッシュしたり、ブルースクリーンが発生したりする可能性があります。
興味深いことに、HyperThreaded Pentium では問題が発生しません。
シングル コアで完全に動作し、マルチコア CPU でフレークするサンプル コードがありました。どこかにありますが、まだ探しています。その要点は、ビジター パターンとして実装された場合、予測できない回数の反復の後にフレークが発生するということでしたが、ビジターが操作したオブジェクトにメソッドを移動すると、問題が解消されました。
これは、フレームワークにオブジェクト参照を解決するための何らかの内部ハッシュ テーブルがあり、マルチコア システムでは、これへのアクセスに関して競合状態が存在することを示唆しています。
現在、APM を使用してシリアル通信を処理するコードもあります。USBシリアルアダプタの仮想comportドライバ内で断続的にブルースクリーンが発生していましたがThread.Sleep(0)
、毎回実行することでこれを修正しましたStream.EndRead(IAsyncResult)
ランダムな間隔で、私が提供する AsyncCallbackStream.BeginRead(...)
が呼び出され、ハンドラーが を呼び出そうとすると、次Stream.EndRead(IAsyncResult)
の状態をスローIOException
します。The I/O operation has been aborted because of either a thread exit or an application request.
これもマルチコアに関連しており、ある種の内部エラーが待機スレッドを強制終了し、この動作につながっていると思われます。私がこれについて正しければ、フレームワークにはマルチコア環境のコンテキストで重大な欠陥があります。私が言及したような回避策はありますが、他のフレームワーク コード内で適用する必要がある場合があるため、それらを常に適用できるとは限りません。
たとえば、上記の IOException に関してネットを検索すると、複数のスレッドを使用していることさえ明らかに知らない人々によって書かれたコードに影響を与えていることがわかります。
Microsoft は、これらのバグ レポートを再現不可能として吹き飛ばす傾向があります。これは、問題がマルチコア システムでのみ発生し、このようなバグ レポートでは CPU の数が言及されていないためだと思われます。
だから... 問題を特定するのを手伝ってください。私がこれについて正しければ、反復可能なテストケースでそれを証明できなければなりません。なぜなら、私が間違っていると思うことは、フレームワークとランタイムの両方でバグ修正を伴うからです。
問題は、フレームワークよりも私のコードにある可能性が高いことが示唆されています。
問題のバリアント A を調査して、問題のコードをサンプル アプリに移植し、1 つの CPU で動作して 2 つの CPU で失敗するスレッド セットアップとメソッド呼び出しだけが残るまで、それを切り詰めました。
シングル コア システムがなくなったため、バリアント BI はそれほどテストされていません。繰り返しますが、シングル コア プラットフォームでこの例外を見た人はいますか?
残念ながら、誰も私の疑いを確認することはできず、反論するだけです.
私が間違いやすいと言うのは役に立ちません。私はすでにこれに気づいています。
.NET アプリケーションを単一の CPU に固定する方法を知っていれば、これを理解するのに非常に便利です。---VM の提案をありがとう。私はまさにそれをします、良い電話です。