次のような状況があります。
int funcA()
{
/*There will call funcB*/
funcB();
}
funcB()
長く続くかもしれません。そして、5分以上実行されていることがわかった場合は、中止funcB()
して他のことを続けたいと思います.
これどうやってするの?
次のような状況があります。
int funcA()
{
/*There will call funcB*/
funcB();
}
funcB()
長く続くかもしれません。そして、5分以上実行されていることがわかった場合は、中止funcB()
して他のことを続けたいと思います.
これどうやってするの?
これを行う 1 つの方法は、入力して からの経過時間を測定することです。funcB()
たとえば、 にループがある場合ですfuncB()
。理想的には、関数は成功または早期終了を示す値を返すため、完了funcA()
したかどうかを知る方法がありfuncB()
ます。
もう 1 つの方法はfuncB()
、独自のスレッドで実行することです。メイン スレッドが 5 分経過したと判断した場合、実行中のスレッドを終了できますfuncB()
。
funcBで機能をコーディングして、それが戻ることを認識できるようにする必要があります。たとえば、funcBがファイルに書き込む場合、他のものはやや安全ではありません。これを行うには多くの方法があります。funcBにループがあり、それを中止したいとします。IO操作のブロックなど、他に何かがある場合は、これを少し異なる方法で行う必要があります。
シングルスレッドの場合は、中止ロジックを直接funcBにコーディングできます。また、funcBの関数ポインター引数を指定することもできます。この引数は、ループラウンドごとに関数を呼び出して、中止できるかどうかを確認します。そうすれば、さまざまな中止条件をより簡単に設定できます。
複数のスレッドがある場合は、funcBを中止するときに他のスレッドから設定したアトミックフラグ変数を使用し、funcBループでそれをテストする必要があります。これは、ループを実行しているスレッドを終了するための最も一般的な方法です。
追加:ファイル操作を中止する場合、いくつかのことを行うと安全に実行できます。
この関数は、(同じディスクパーティションにある)一時ファイルに書き込みを行い、それを閉じて名前変更操作(ファイルが同じパーティションにある場合はOSレベルでアトミック)を使用して、最終ファイルを作成/置換する必要があります。そうすれば、操作が中止されても、最終的なファイルが破損した状態のままになることはありません。
呼び出し元は、一時ファイルのファイルハンドルまたはファイル記述子を持っている必要があります。これにより、ファイルが開いているときにファイル操作が中止された場合にファイルを閉じることができます。強制終了された別のプロセスでファイル操作が発生した場合、すべてのファイルハンドルが閉じられるため、これは必要ありません。
また、中止された関数/スレッド/プロセスがファイルの名前を最終的な名前に変更したり削除したりする機会がなかった場合に備えて、呼び出し元は常に一時ファイルの削除を試みる必要があります。
追加2:Unix / Linuxでは、alarm()関数を使用できます。これを参照してください:単純な信号-Cプログラミングとアラーム機能