Cのアルゴリズムにランタイム制限(時間単位)を設定して、制限に達するとアルゴリズムが停止するようにします(たとえば、12時間)。誰にどのようにこれを行うための任意の提案がありますか?Cのランタイムリミットタイマー
1
A
答えて
1
time()
を使用すると、アルゴリズムの各繰り返しで開始時刻と時刻を取得できます。 difftime()
を使用して差を計算し、特定の値を超えたときにアルゴリズムを終了することができます。
あなたのアルゴリズムが反復的であると仮定すると、5秒後にループを終了するサンプルコードがあります。
#include <stdio.h>
#include <time.h>
int main(int argc, char **argv)
{
time_t start_time;
time_t now_time;
time(&start_time);
while (1) {
/* Your algorithm goes here */
/* Time check code */
time(&now_time);
if (difftime(now_time, start_time) >= 5) {
break;
}
}
return 0;
}
これは、あなたの時間のチェックコードは、アルゴリズムの実行中に頻繁に呼ばれることを知っている多くの場合のために働く非常にシンプルなソリューションです。アルゴリズムの実行中に頻繁に呼び出されるような時間チェックコードを置くことができる良い場所を見つけることができない場合は、スレッド内でアルゴリズムを実行し、制限を超えたときにアルゴリズムを終了させる方法があります。これは、Linuxであるので
#include <stdio.h>
#include <time.h>
#include <pthread.h>
void *algo(void *arg)
{
while (1) {
printf("I AM THE ALGO!!\n");
}
return NULL;
}
int main(int argc, char **argv)
{
time_t start_time;
time_t now_time;
pthread_t algo_thread;
int ret = pthread_create(&algo_thread, NULL, algo, NULL);
time(&start_time);
/* Time check loop */
while (1) {
time(&now_time);
if (difftime(now_time, start_time) >= 5) {
break;
}
}
return 0;
}
1
、あなたはそれが便利alarm()
を使用することを見つけるかもしれない(例えばsleep()
などの邪魔になる可能性の呼び出しを、必要としない、あなたのアルゴリズムを提供)。次にsigaction()
を使用してSIGALRM
のハンドラを登録できます。アラームがポップアップすると、シグナルを処理しますが、タイムアウトを処理します。
これは、上記のコードで5秒間のタイムアウトと終了を待ちます。 exit以外の処理をしたい場合は、アルゴリズムを終了するようにグローバル値を設定することができます(スレッドを使用している場合は、注意してください)。
関連する問題
- 1. C、C#、C++、Java用のC#コードアナライザ。
- 2. c、C++、c#の機能テストツール
- 3. コンパイルC++ C#の
- 4. c/C++のReSharper
- 5. C/C++のワークフローエンジン
- 6. C/C++のオプションパーサー?
- 7. のPInvoke - C++ C#
- 8. C/C++のポインタ
- 9. C#のC++
- 10. c&C++のプロトコルバッファ
- 11. C/C++のテキストインデックスライブラリ
- 12. C#のOBJ-Cの
- 13. C/C++でのC-ストリングの定義
- 14. C/C++コードベースのリンク先のCライブラリ
- 15. C++/CLIでのC/C++データ型のマッピング
- 16. netbeansのC/C++プログラム
- 17. C++のC++/CLIラッパー
- 18. C++エラー:++プログラミングcの
- 19. C++、私のC IN
- 20. C#のジェネリックC++テンプレート
- 21. ヘッダのC/C++ネームスペース
- 22. C C++の配列
- 23. Cのチャットクライアント? (Cネットワークプログラミング)
- 24. C++とObjective-Cの
- 25. C/C++でのプロトタイプ
- 26. のC#unamanged C++ REF
- 27. C/C++のLAPACKラッパー
- 28. C/C++ダイナミックリンクライブラリのオーバーロード
- 29. 差( "%のC"、&C)およびscanf( "%のC"、&C)
- 30. C#はObjective-CとC++のようにCのスーパーセットですか?
どのようなOSで、壁の時間やCPU時間を意味していますか? –
この確認はプログラム内で行う必要がありますか? – Pih
OSはLinuxで、内部で確認が可能 – perigee