2

適切な質問

シングルコアマシンでこの例外を経験した人はいますか?

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 の提案をありがとう。私はまさにそれをします、良い電話です。

4

5 に答える 5

2

ブルー スクリーンは、アプリケーションやフレームワークのバグだけが原因ではありません。ブルー スクリーンには、カーネル モードからの「ヘルプ」が必要です。問題の 1 つは、欠陥のあるドライバーがどの「時代」にコーディングされていたとしても、欠陥のあるドライバーです。

別のスレッドがまだポートを使用しているときに、あるスレッドがポートを閉じる可能性については、これはフレームワークのハウスキーピングのいくつかの有名なバグに関連している可能性があると思います。それらのバグはコア数に依存しないと思いますが、コア数が多いほどバグに遭遇する頻度が高くなる可能性があります。フレームワークによるポートの削除が早すぎるのを防ぐために、GC.KeepAlive 呼び出しを追加してみてください。

于 2008-11-19T07:16:38.083 に答える
2

現在、アプリケーションで使用されているファイル転送スタック全体を書き直しています。他の従業員との会話から、シングル コアのラップトップと低速の接続が運用環境で使用されていた数年前には、ある程度機能していたことがわかりました。現在、誰もがデュアルコアと高速インターネットに移行しており、ソフトウェア全体が予測できない結果を示しています。

そのため、コードをさらに学習し始めたとき、それを開発した人は、マルチスレッド コードを適切に記述する方法について 1 つの考えも持っていないことがわかりました。すべての「同期」は Thread.Sleep() を使用して行われます! スレッド管理は、「ファイア アンド フォーゲット」ベースで行われました。スレッドを停止したい人はいますか?Thread.Abort()! くそっ!いまいましいものがまったく機能していたのは驚きです。

私のポイントは、あなたのコードをチェックしてください。カスタムハードウェアを使用している場合は、それらのドライバーのコードです。問題は、.NET、Win32、または他の場所ではなく、そこにあります。

于 2008-11-19T18:39:08.877 に答える
2

あなたの説明に基づいて、私の傾向は COM ポート ドライバーを非難することです。そのドライバーはマルチコア時代より前に開発されましたか? 私はかつてそのようなデバイスで同様の問題を抱えていましたが、後のドライバーのリビジョンでありがたいことに修正されました。

追加: アプリを単一の CPU に制限する方法に関する質問に答えるには、プロセス アフィニティを単一の CPU に設定する必要があります。このリンクを参照してください。タスク マネージャーを使用してプロセスが開始された後にこれを行うこともできます (タスク マネージャーでプロセスを右クリックし、[アフィニティの設定...] を選択します)。

于 2008-11-19T02:07:30.173 に答える
1

Vistaより前は、それを発行したスレッドが終了したときに進行中だった非同期IOはすべて終了します。これにより、報告するエラーが発生する傾向があります。

スレッドの終了またはアプリケーションの要求により、I/O操作が中止されました。

これがあなたの質問に何らかの形で関連しているかどうかはわかりませんが、操作が完了する前に終了する可能性のあるスレッドから非同期操作を発行していますか?

于 2008-11-19T17:39:27.297 に答える
1

私はここで完全に言葉を失っています。デュアルコアマシンでコードが壊れていると言っていますが、MSが疑われています!!!

今日では、すべてのマシンがデュアルまたはクアッド コアを搭載しています。.net フレームワークにデュアル コアでの動作に重大な問題があった場合、ライブ メッセンジャー、ライブ ライター、およびその他の多くの .net シック アプリケーションが頻繁に壊れないのはなぜですか。SQL Server 2K5 および 2K8 の管理スタジオも .net にあると思います。System.Web の実装全体は C# 自体にあります。Biztalk オーケストレーション デザイナー全体が .net にある

今、ポイントに来ています。あなたのアプリケーションにはマルチスレッドがあり、多くの非同期呼び出しが行われているようです。いいえを構成する柔軟性はありますか。アプリケーション内のスレッドの数? はいの場合、スレッドを 1 に制限してからテストできますか。マルチスレッドによるエラーは追跡が非常に困難です。

SOSは試しましたか?それを試してみてください...私はそれについてあまり知りませんが、Googleでそれについて調べてください.SOSの使用法に関する優れたリソースが確実に得られます.

最後の手段として、MS サポートでケースをオープンしてください。最初はばかげた質問で始まるので、少し我慢する必要があります:)。幸運を。

于 2008-11-19T18:16:00.390 に答える