2012-01-27 3 views
1

Cのアルゴリズムにランタイム制限(時間単位)を設定して、制限に達するとアルゴリズムが停止するようにします(たとえば、12時間)。誰にどのようにこれを行うための任意の提案がありますか?Cのランタイムリミットタイマー

+0

どのようなOSで、壁の時間やCPU時間を意味していますか? –

+0

この確認はプログラム内で行う必要がありますか? – Pih

+0

OSはLinuxで、内部で確認が可能 – perigee

答えて

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; 
} 
+0

プログラムは「浮動小数点例外」エラーを返します。また、タイマーは数時間で動作する可能性がありますか?第2のカウンターがダブルタイプを超えている可能性があるため。 – perigee

+0

はい、時間を12時間にしたい場合は、私の例では '5'ではなく' 12 * 3600'を秒数として使用してください。 –

+0

@perigee:ダブルの最大値は、通常約1.7e308です。すぐにそのようなランタイムはありません。文字通り。 – unwind

1

、あなたはそれが便利alarm()を使用することを見つけるかもしれない(例えばsleep()などの邪魔になる可能性の呼び出しを、必要としない、あなたのアルゴリズムを提供)。次にsigaction()を使用してSIGALRMのハンドラを登録できます。アラームがポップアップすると、シグナルを処理しますが、タイムアウトを処理します。

これは、上記のコードで5秒間のタイムアウトと終了を待ちます。 exit以外の処理をしたい場合は、アルゴリズムを終了するようにグローバル値を設定することができます(スレッドを使用している場合は、注意してください)。