2012-03-04 13 views
2

我有一些使用clock_gettime()函數的問題。C++ time.h,clock_gettime(),語義錯誤,如何鏈接Eclipse中的實時庫?

#include <iostream> 
#include <time.h> 

timespec timer_start; 
timespec timer_end; 

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &timer_start); 
// sleep for 5 seconds 
boost::this_thread::sleep(boost::posix_time::milliseconds(5000)); 
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &timer_end); 

std::cout << (timer_end.tv_sec - timer_start.tv_sec) << ":" << (timer_end.tv_nsec - timer_start.tv_nsec) << std::endl; 

我得到的輸出是這樣的

0:6934599

看來,計時器只經過693個毫秒左右。

我在Linux gnu gcc 4.6上用g ++ -lrt編譯程序。我也收到語義錯誤,說 符號'CLOCK_PROCESS_CPUTIME_ID'無法解析

謝謝。

+1

如果你有一個編譯器錯誤,怎麼是你能夠運行該程序? – 2012-03-04 11:57:23

+0

我也覺得它很有趣,也許是因爲我只會得到一個語義錯誤。 – 2607 2012-03-04 12:01:14

+1

如果你的編譯器可以告訴你**語義**錯誤,那麼它比我見過的任何編譯器都更聰明。 – James 2012-03-04 12:01:48

回答

4

撇開運行無法編譯的程序的不可能性,睡眠通常是一個系統調用:調用內核函數,內核發送線程進入睡眠狀態,調度其他線程和進程以運行(或CPU進入省電模式),並在要求的時間再次喚醒原來的線程。在此期間,睡眠線程不會佔用CPU時間。經過的(實際)時間通常被稱爲掛牆時間

將此對比實時等待代碼中的while循環重複檢查時鐘,並且僅在5秒鐘過後才終止。這種等待架起CPU時間從其他進程中帶走。也

需要注意的是6934599納秒約6.93毫秒,而不是693

+0

謝謝你的回覆。我不知道如果發送線程進入睡眠狀態不會消耗CPU時間,因此測量結果無論如何都不準確。 – 2607 2012-03-04 15:01:41