はじめまして。にゃかたと申します。
自作の常駐マルチスレッドプログラムが1ヶ月に1度とか1週間に一度、もしくは
数ヶ月落ちないなど不安定な状態になっています。
ダンプを調べてみるとMSVCRTD.operator delete()内部や
ntdll.DeleteCriticalSection()でアクセス違反が発生しています。
operator delete()についてはスレッド間で共有している領域ではないのと
delete内部でCALLされる_free_dbg()または_free_dbg_lk()で落ちています。
普通は手前のメモリチェックマクロで引っかかるはずが通過しています。
DeleteCriticalSection()に至ってはなにがなんだかわかりません。
CRITICAL_SECTION構造体の実体は外部変数で宣言しており、当然構造体メンバ変数には
手を加えていません。
このような事象が発生するケースが知りたいのですが、どのようなケースが存在するのか
ご教授いただけませんでしょうか?
OS:WindowsNT 4.0 Server SP5 or 6a, Windows2000 SP3
2CPUマシンでのみ発生し、1CPUマシンでは1件も起きていません。
以上、よろしくお願いいたします。
直接的な回答ではありません。
参考程度に読んでいただければと思います。
私がざっと調べた感じではVCやライブラリの不具合でそういう現象が
起こるというケースは見つける事が出来ませんでした。
マルチCPUでのみ起こり、シングルCPU環境では起こっていないという
ケースだけから想像できるのは、スレッド間の同期が取れないような
ケースが問題のプログラム上にあるのではという事です。
処理の重さを頼りにスレッド間で動作の同期を取っている部分は
ないでしょうか?
シングルCPUよりもマルチCPUの方がスレッドの同期はよりシビアに
なると思います。もしかするとシングルCPUでは考えられないような
順番でスレッドが動いてしまうケースがあるのかもしれません。
もう一度、スレッド間の同期に問題ないかどうか確認されては
どうでしょうか?