2016-12-25 26 views
0

我需要在我的代碼中使用一些定時器。我有這樣的事情:Linux定時器CLOCK_PROCESS_CPU_ID不起作用

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); 

哪裏c_thread是一些簡單的函數,它是設置新的計時器,第二個是:

#define SECOND 1000000000 

c是類似2.25

而且我的問題是該計時器在它應該時不會調用c_thread。當我將CLOCK_PROCESS_CPUTIME_ID更改爲CLOCK_REALTIME時,一切正常,並且被調用,但是當我使用第一個時沒有任何反應。我還使用其他具有clock_gettime函數的CLOCK_REALTIME計時器檢查CLOCK_PROCESS_CPUTIME_ID,並且時鐘值達到我的it_value。

任何想法可能是錯的?

而我的第二個問題:是否有任何方法將某些參數傳遞給使用定時器稱爲線程的函數?

+0

請給出一個[MCVE]。 'CPUTIME'指示進程消耗多少CPU時間(說明明顯)。如果你的程序進入休眠狀態,那麼它將永遠達不到2.5秒的CPU時間。所以我們需要在設置定時器之後看看程序還有什麼功能。 – kaylum

回答

2

@annamataris問題與spinlock和nanosleep的東西無關。有理由僅使用CLOCK_REALTIME,因爲。

POSIX定時器系統調用首先出現在Linux 2.6中。在 之前,glibc使用POSIX線程提供了不完整的用戶空間實現 (僅限CLOCK_REALTIME計時器),在2.17之前版本的glibc 版本中,在運行2.6版之前的Linux內核的系統上,該實現退回到此技術 。

閱讀man timer_create欲瞭解更多信息。