実行しているとたまに「ブレークポイントの設定」というメッセージとともに
混在モードに突入して処理が停止してしまいます。
コールスタックで調べてみたところ、INIファイル読み込み関数の部分で
不正な値をかえしていることが判明しました。
(GetProfileStringの戻り値がNULL、引数に関する設定ミスは無し。)
そこで、お聞きしたいのが「API関数の実行を失敗する場合があるのかどうか?」
ということです。プログラムの状況は以下のとおり。
//
・読み込みは一つのINIファイルに対して行われる。
・複数のスレッドから同時に読み込みアクセスがおこる可能性あり。
・INIファイルに対する読み込みは1秒間に5回以上はアクセスする。(多いと20回)
・INIファイルに対するアクセスは読み込みのみで、書き換えは行われない。
・プログラム実行後10分~8時間でランダムに発生している。
・メモリ不足はない。
//
今のところは短い時間にたくさんのアクセスを繰り返したから
読み取りに失敗してしまったと予想して、読み込み回数を減らそうと考えています。
似たような事象を体験された、又は聞いたことがある方がいらっしゃいましたら
教えていただけると助かります。
また、不足している情報などございましたら、ご指摘ください。
動作環境:::VC++6.0(SP5.0)、WIN_XP、MFC使用
> ・複数のスレッドから同時に読み込みアクセスがおこる可能性あり。
> ・INIファイルに対する読み込みは1秒間に5回以上はアクセスする。(多いと20回)
ご質問の内容とは直接関係なくなってしまうかもしれませんが、処理の始めの方で
一度すべて INIファイルから情報をメモリに取得しておいて、それを参照するのでは
駄目ですかね?
何となくファイルアクセスに無理がありそうだし、メモリに確保したほうが早そう
な気がして…。無関係な話だったらごめんなさい…。
ありがとうございます。
>>INIファイルから情報をメモリに取得
>>~
>>無関係な話だったらごめんなさい…。
いえ、そのとおりです。。。
設定情報自体もたいした量ではなく、実行時にメモリに読み込んでおけば
すむものでした・・・・
ただいま変更を掛けております。これで頻度が減ればいいのですが・・・
(方針はひょっとしてさんの案でよいと思います、情報だけ。。。)
INIファイル関連のAPIは、そのつどファイルアクセスせずに
キャッシュに溜め込んだデータを(あれば)返すように実装されています
つまり、メモリ確保/開放という処理を場合に応じてやっていることになります
で、問題はこれらの関数がスレッドセーフかどうかです
そのような現象が起きるということはスレッドセーフじゃないのかもしれないですね