2016-12-25 6 views
0

私のコードでいくつかのタイマーを使用する必要があります。LinuxタイマーCLOCK_PROCESS_CPU_IDが機能しません

#define SECOND 1000000000 

cは2.25

のようなもので、私の問題は、次のとおりです。c_threadは新しいタイマーを設定しているいくつかの単純な関数である

struct sigevent ec; 

    ec.sigev_notify = SIGEV_THREAD; 
    ec.sigev_value.sival_ptr = &c_timer; 
    ec.sigev_notify_function = c_thread; 
    ec.sigev_notify_attributes = NULL; 

    secs = floor(c); 
    nsecs = (long long) SECOND * (c - secs); 
    printf("%ds\t%lldns\n\n",secs,nsecs); 
    it1c.it_value.tv_sec = secs; 
    it1c.it_value.tv_nsec = nsecs; 
    it1c.it_interval.tv_sec = 0; 
    it1c.it_interval.tv_nsec = 0; 

    timer_create(CLOCK_PROCESS_CPUTIME_ID, &ec, &c_timer); 
    timer_settime(c_timer, 0, &it1c, NULL); 

、SECONDがある:私はこのような何かを持っていますこのタイマーは、必要なときにc_threadを呼び出さないことを指定します。 CLOCK_PROCESS_CPUTIME_IDをCLOCK_REALTIMEに変更すると、すべてが正常で、呼び出されますが、最初に何も起こりません。また、clock_gettime関数で他のCLOCK_REALTIMEタイマーを使用してCLOCK_PROCESS_CPUTIME_IDをチェックしています。クロックの値がmy it_valueに達しています。

何が間違っている可能性がありますか?

私の2番目の質問:タイマーを使ってスレッドと呼ばれる関数に引数を渡す方法はありますか?

+0

[MCVE]を付けてください。 'CPUTIME'はプロセスが消費するCPU時間を示します(明白です)。プログラムが無期限にスリープ状態になると、CPU時間が2.5秒に達することはありません。だから、タイマーを設定した後にプログラムが何をするのかを知る必要がある。 – kaylum

答えて

2

@annamatarisの問題は、スピンロックおよびナノスリープの問題とは関係ありませんでした。 CLOCK_REALTIMEだけを使用する理由があります。

POSIXタイマーシステムコールは、Linux 2.6ではじめて登場しました。 より前のバージョンでは、glibcはPOSIXスレッドを使用して不完全なユーザ空間実装 (CLOCK_REALTIMEタイマーのみ)を提供しました。glibc 2.17より前のバージョンでは、2.6より前のLinuxカーネルを実行するシステムでは実装は に戻ります。詳細は

読む男timer_create

関連する問題