1

Borland c ++ 3.1を使用している人がいるかどうかはわかりませんが、使用する必要があります。

単純なスレッドを実装し、タイマー割り込みを介してそれらのスレッドのコンテキストを変更するプログラムがあります。

私は無限ループと2つのスレッドを持っており、それらはそれぞれの仕事をして、お互いとメインのスレッドの間で変化します。彼らの仕事は、コンソールに何かを書くために、いくつかの出力を生成することです。問題は、プログラムを実行するたびに、異なることが起こることです。

時々それは30分の間動作し、それはそれがすべきことを書くのをやめるだけです。書き込みが停止するだけでエラーは発生せず、borlandはクラッシュしません。時々それは止まり、ボーランドはメッセージなしでクラッシュします。時々それは停止し、ボーランドはメッセージ「違法な指示」でクラッシュします時々それが停止する前にそれが書く最後の行に出力にあるべきではないいくつかの奇妙な文字があります。

「フル」でボーランドが変な動作をするのはコンソールですか?何が問題になる可能性がありますか?

4

2 に答える 2

1

私の記憶が正しければ、割り込みから呼び出されたときにDOSでコンソールに書き込む(またはファイルI / Oを使用する)のは安全ではありませんでした。これを正しく行うには、「DOS再入可能フラグ」と呼ばれるものをチェックし、それがゼロの場合にのみコンソールに書き込む必要があります(http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH18/CH18-3を参照)。 htmlまたはWebで詳細を検索してください)

于 2012-09-04T18:47:01.067 に答える
0

実際の 8086 モードと仮想 8086 モードでは、プログラムは互いに保護されていません。したがって、プログラムが何かを台無しにした場合、たとえば次のようになります。

  1. プログラムまたはその ISR でのスタック オーバーフローによるメモリ破損を含め、そのスレッド (または適切なスレッド自体) に属さないメモリを上書きします。
  2. ISR のいずれかで CPU レジスタの保存 (= 保存してから復元) に失敗する
  3. ハードウェアの状態を、システムの残りの部分にとって予期しないものに変更します
  4. システムの残りの部分に明らかなようにタイマーの頻度を変更します

そのいずれかを行う場合、何かがクラッシュしたり、ハングしたり、他の方法で誤動作したりすることは驚くべきことではありません.

上記の 1 および/または 2 の問題を抱えていると思います。そこでも競合状態が発生する可能性があります。

残念ながら、あなたのコードを見ることなく、私たちはこれ以上助けることはできません. 考えてみてください、それは電話で新しい患者を治療するようなものです。

于 2012-09-04T04:33:22.113 に答える