重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

VC++でログファイルを作成しており、ファイルには事象が発生した日付時刻を組み合わせて保存しています。通常であれば、発生した事象の並びに合わせて時刻も推移していますが、時々、後に発生した事象に対する時刻が、直前の事象に対する時刻より前の時刻が保存されてしまう現象が発生しています。(0.5~1秒強前後ですが。)OSはNT、2000系です。プログラム作成上で要注意項目等あれば教えていただけないでしょうか。
 ※1:時間取得には「time()」を使用しています。
 ※2:マルチスレッド上でのソフト作成を行っていますが、ログ保存処理には排他制御を施しているつもりです。
よろしくお願いします。

A 回答 (2件)

ライブラリはマルチスレッド用のを使ってますよね?



マルチスレッドの処理内容がわからないとなんとも言えませんが,
時間取得のタイミングや、ログ書き込みのタイミング,
排他制御の方法(期間)の関係で,ログ書き込みの順番が入れ替わる可能性はありませんか?
こんな感じで。

スレッド1 スレッド2
時刻取得  ----
----  時刻取得
----  ログ書込
ログ書込  ----

このような場合、単にログ書込の排他制御では回避できませんし、
GetTickCount等を使っても回避できません。
この場合なら簡単な回避方法は、排他制御の期間を時刻取得前からログ書込み完了後までにすることです。
性能上の問題とか,長時間になりすぎるとかがある場合は別な方法にする必要がありますが。
    • good
    • 0

マルチスレッドが原因でしょうね。


GetTickCount、あるいはGetSysTimeで取得してはどうでしょうか?
基本的に原因は排他制御ができていないのだと思います。
time()で取得した瞬間からログ書込みの間に他のスレッドが
time()を実行しているのでしょう。

スレッド1:time()→ログ書込み
スレッド2:time()→ログ書込み
スレッド1実行中にスレッド2が1サイクルしてしまっているのでは?
ログ書込み直前にtime()で取得すれば、誤差は縮まると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!