多線程中定時(shí)器的使用
unsigned int alarm(unsigned int seconds);
這個(gè)函數(shù)在使用上很簡(jiǎn)單,第一次調(diào)用這個(gè)函數(shù)的時(shí)候是設(shè)置定時(shí)器的初值,下一次調(diào)用是重新設(shè)置這個(gè)值,并會(huì)返回上一次定時(shí)的剩余時(shí)間。
#i nclude
int setitimer(int which, const struct itimerval *value,
這個(gè)函數(shù)使用起來(lái)稍微有點(diǎn)說(shuō)法,首先是第一個(gè)參數(shù)which的值,這個(gè)參數(shù)設(shè)置timer的計(jì)時(shí)策略,which有三種狀態(tài)分別是:
ITIMER_REAL:使用系統(tǒng)時(shí)間來(lái)計(jì)數(shù),時(shí)間為0時(shí)發(fā)出SIGALRM信號(hào),這種定時(shí)能夠得到一個(gè)精準(zhǔn)的定時(shí),當(dāng)然這個(gè)定時(shí)是相對(duì)的,因?yàn)榈搅宋⒚爰?jí)別我們的處理器本身就不夠精確。
ITIMER_VIRTUAL:使用進(jìn)程時(shí)間也就是進(jìn)程分配到的時(shí)間片的時(shí)間來(lái)計(jì)數(shù),時(shí)間為0是發(fā)出SIGVTALRM信號(hào),這種定時(shí)顯然不夠準(zhǔn)確,因?yàn)橄到y(tǒng)給進(jìn)程分配時(shí)間片不由我們控制。
ITIMER_PROF:上面兩種情況都能夠觸發(fā)
第二個(gè)參數(shù)參數(shù)value涉及到兩個(gè)結(jié)構(gòu)體:
struct itimerval {
struct timeval {
};
在結(jié)構(gòu)體itimerval中it_value是定時(shí)器當(dāng)前的值,it_interval是當(dāng)it_value的為0后重新填充的值。而timeval結(jié)構(gòu)體中的兩個(gè)變量就簡(jiǎn)單了一個(gè)是秒一個(gè)是微秒。
上面是這兩個(gè)定時(shí)函數(shù)的說(shuō)明,這個(gè)函數(shù)使用本不是很難,可以說(shuō)是很簡(jiǎn)單,但是碰到具體的應(yīng)用的時(shí)候可能就遇到問(wèn)題了,在多進(jìn)程編程中使用一般不會(huì)碰到什么問(wèn)題,這里說(shuō)的這些問(wèn)題主要體現(xiàn)在多線程編程中。比如下面這個(gè)程序
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
void sig_handler(int signo)
{
}
void *pthread_func()
{
}
int main(int argc, char **argv)
{