デバック時にデッドロック状態

[戻る]
トンプソン [E-Mail] 2005/03/03(木) 10:42:22
いつもお世話になっています。
INIファイルの読み込みをベクタ配列へ格納するコードを作成しています。
今、デバック作業をしているのですが、

DBG: ブレーク命令は 3 秒の間成功しませんでした。
DBG: デッドロック状態の可能性があります。ソフトウェアが異常です。


とエラーが出てしまい、どこで起きているのかが不明で困っています。
デッドロック状態。。。=どこかでアクセスバイオレーションしているんでしょう
か・・・?

原因を探すコツがあれば教えてくれませんか?
よろしくお願いします。

wood 2005/03/03(木) 19:27:58
>アクセスバイオレーション
これは境界侵害と言う意味だったはず
つまり飛び越えて領域アクセスを行っていけないところを参照した場合のことだと
思います

>デッドロック
排他制御がうまくいっていないと思います
つまり PG−A.EXEとPG−B.EXEとが同時に実行したときに
FILE−A.TXTをどちらのEXEもファイルロック&更新モードで
タイミングよくオープンした場合のことです

1とつのEXEの場合 2つのスレッドを発生させてスレッド内で同じファイルを
オープンさせた場合も、考えられます

「排他制御」について見直して見てはどうでしょうか

トンプソン [E-Mail] 2005/03/04(金) 10:31:56
woodさんお返事ありがとうございます。
今回のエラーは思わぬ箇所で起きており、
改善されるパターンとして

・VC++を終了し、再度起動する。
・Windowsのドライブチェックをする。

この2点を行うと修復されてるみたいなんです。

>2つのスレッドを発生させてスレッド内で同じファイルを
オープンさせた場合
調べてみます。
また「排他制御」についても学んでみます。
どうもでした!

WIZ [E-Mail] 2005/03/05(土) 16:03:52
> >デッドロック
> 排他制御がうまくいっていないと思います
> つまり PG−A.EXEとPG−B.EXEとが同時に実行したときに
> FILE−A.TXTをどちらのEXEもファイルロック&更新モードで
> タイミングよくオープンした場合のことです
>
> 1とつのEXEの場合 2つのスレッドを発生させてスレッド内で同じファイルを
> オープンさせた場合も、考えられます

上記で書かれている「ファイルロック」が1つの同期オブジェクトであり、
それによってスレッド等の永久待ちが発生する場合でも、デッドロックとは
言わないと思います。これは最初にロックしたスレッド等のアンロック漏れ
か、同期オブジェクトのバグなどが原因です。

デッドロックとは以下のようなケースを言います。
(1)同期オブジェクトがA,Bと2個(以上)ある。
(2)スレッド1はA,Bの順にロックし、スレッド2はB.Aの順にロックする
  プログラム構造である。
(3)スレッド1がAをロック後、スレッド2にディスパッチチ。スレッド2はBを
  ロック後Aのアンロック待ちになる。スレッド1はディスパッチされてもBの
    アンロック待ちで動けない。
(4)結局スレッド1も2もこれ以上動けず、同期オブジェクトAもB決してアンロック
  されないという状態に陥る。

トンプソン 2005/03/14(月) 18:29:04
[[解決]]
アンロックされない状態ですか・・・。
ちょっと調べるすべを無くしてまして・・・。
でも、ハードディスクチェックを行った後からは
なぜか直りました^−^;
ただ、このPCは前にもある同じ変数名を使用するとアクセスバイオレーションになった
り、
あるクラス内関数の処理コード1行目にブレイクを貼ると
アクセスバイオレーションになったりするんです。
なにか、ドライブ等ハードが原因かも知れません。
もう少し知識を増やした上で再検討してみます。
WIZ さんメールありがとうございます。

古いスレッドには追加発言できません。