Cプログラムで長時間実行されているwhileループでソフトロックアップ/無応答を防ぐ正しい方法はどのようになりますか?
(dmesg はソフトロックアップを報告しています)
擬似コードは次のようになります。
while( worktodo ) {
worktodo = doWork();
}
私のコードはもちろんもっと複雑で、進行状況を報告するために 1 秒に 1 回実行される printf ステートメントも含まれていますが、問題は、この時点でプログラムが ctrl+c に応答しなくなることです。
私が試したものは機能します(ただし、代替手段が必要です):
- ループの反復ごとに printf を実行します (理由はわかりませんが、プログラムはそのように再び応答します (???)) - 不要な printf 呼び出しのために多くのパフォーマンスが浪費されます (各 doWork() 呼び出しはそれほど長くかかりません)
- sleep/usleep/... を使用する - プログラム全体がすでにフルスピードで数時間実行されているため、(処理) 時間の無駄のようにも思えます
私が考えているのは、ある種の process_waiting_events() 関数などであり、別のシェルで kill を使用してプログラムを停止できるため、通常のシグナルは正常に機能しているようです。
追加の背景情報: 私はGWANを使用しており、私のコードは main.c の「メンテナンス スクリプト」内で実行されています。これは、私が知る限り、メイン スレッドで実行されているようです。
どうもありがとうございました。
PS: はい、ソフト ロックアップに関して見つけた他のすべてのスレッドを確認しましたが、それらはすべて、ソフト ロックアップが発生する理由を尋ねているようですが、理由はわかっており、それらを防止する方法が必要です。
PPS: プログラムを最適化する (実行時間を短縮する) ことは、実際には解決策ではありません。29GB の bz2 ファイルを処理して、約 400GB の xml に抽出し、シングル スレッドで毎秒約 10-40MB の速度で処理しているため、最大速度では、I/O に拘束され、それでも数時間実行されます。