欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
【原創(chuàng )】技術(shù)系列之 定時(shí)器(二)

作者:CppExplore 網(wǎng)址:http://www.cppblog.com/CppExplore/
一、上篇文章描述。文章《定時(shí)器(一)》http://www.cppblog.com/CppExplore/archive/2008/04/02/46111.html實(shí)現了一個(gè)定時(shí)器模塊,這個(gè)實(shí)現每次延時(shí)時(shí)間到都要掃描所有的定時(shí)器對象,效率低下。開(kāi)始設想的時(shí)候,LIST中的定時(shí)器對象保存間隔時(shí)間段的毫秒值,導致每次延時(shí)時(shí)間到都要做“時(shí)間減少操作”直到減少到零,并且得出不需排序的結論。
二、改進(jìn)。如果其中保存超時(shí)的精確時(shí)間點(diǎn),而不是保存時(shí)間段,則可以在LIST中根據超時(shí)時(shí)間點(diǎn)對定時(shí)器對象排序,延時(shí)時(shí)間到,則從鏈表頭掃描定時(shí)器對象,取其超時(shí)時(shí)間點(diǎn)與當前時(shí)間點(diǎn)對比,如果小于等于當前時(shí)間點(diǎn),則進(jìn)行超時(shí)處理,否則終止繼續掃描,避免不必要的掃描操作。同時(shí)插入對象的時(shí)候插入到合適的位置,以保持鏈表的順序化。
三、主要數據結構。此次容器結構選擇內核數據結構中的TAILQ,因為L(cháng)IST沒(méi)有插入尾部操作(當要插入的定時(shí)器對象超時(shí)時(shí)間點(diǎn)大于所有隊列中的對象的時(shí)候)。
四、新的時(shí)間類(lèi)型操作。另一方面很多地方涉及到對struct timeval結構的操作,這里介紹幾個(gè)對該結構進(jìn)行操作的宏,都已經(jīng)在系統頭文件中定義,可以使用函數原型的方式理解就是如下:

timeradd(struct timeval *p1,struct timeval *p2,struct timeval *result);
timersub(struct timeval 
*p1,struct timeval *p2,struct timeval *result);
timercmp(struct timeval 
*p1,struct timeval *p2,operator op);

對struct timespec同樣有timespecadd/timespecsub/timespeccmp,另外還有兩者的轉換宏,使用函數原型的方式理解就是:

TIMEVAL_TO_TIMESPEC(struct timeval *p1,struct timespec *result);
TIMESPEC_TO_TIMEVAL(struct timespec 
*p1,struct timeval *result);

如果系統的頭文件中找不到,也可以自己實(shí)現下,明白這兩個(gè)結構的細節結構,實(shí)現也很簡(jiǎn)單,這里拿timeradd舉例,其它不說(shuō)了。

#define    timeradd(tvp, uvp, vvp)                        \
    
do {                                \
        (vvp)
->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;        \
        (vvp)
->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;    \
        
if ((vvp)->tv_usec >= 1000000{            \
            (vvp)
->tv_sec++;                \
            (vvp)
->tv_usec -= 1000000;            \
        }
                            \
    }
 while (0)
五、實(shí)現。和上篇文章相比,改動(dòng)比較的在add_timer_和process方法。當前add_timer_操作需要順序掃描插入到合適的位置以保持鏈表的順序。當前process的主要代碼如下:
while(manager->m_state==TIMER_MANAGER_START){
    tm.tv_sec
=manager->m_interval.tv_sec;
    tm.tv_usec
=manager->m_interval.tv_usec;
    
while(select(0,0,0,0,&tm)<0&&errno==EINTR);
    gettimeofday(
&now,0);
/*加上誤差補償時(shí)間*/
    timeradd(
&now,&manager->m_repair,&stand);
    pthread_mutex_lock(
&manager->m_mutex);
    TAILQ_FOREACH(item, 
&(manager->list_), entry_){
/*取修正后的時(shí)間逐個(gè)和定時(shí)器中的超時(shí)時(shí)間點(diǎn)相比,遇到不超時(shí)對象則退出掃描*/
        
if(timercmp(&item->m_endtime,&stand,<)){
                
if(item->m_func)
                        item
->m_func(item,item->m_data);
             
if(item->m_type==CTimer::TIMER_ONCE){
                       manager
->remove_timer_(item);
                      item
->m_state=CTimer::TIMER_TIMEOUT;
                }

            
else if(item->m_type==CTimer::TIMER_CIRCLE){
/*循環(huán)性的要保證鏈表的順序性,如要重新插入,保存entry_的原因,是執行新的插入后不要影響當前進(jìn)行的循環(huán)*/
                    tmpTimer.entry_
=item->entry_;
                    manager
->remove_timer_(item);
                    manager
->add_timer_(item);
                   item
=&tmpTimer;}
                 }

         
else break;
        }

        pthread_mutex_unlock(
&manager->m_mutex);
    }

六、源碼
寫(xiě)了個(gè)簡(jiǎn)單的makefile,執行make就可以生成測試程序:test,執行./test可以看運行效果。make由make so和make test組成,make so在lib目錄下生成libtimer.a。make clean清空。
源代碼下載這里http://www.cppblog.com/Files/CppExplore/timer.tar.gz
七、后記
與上一版本相比,該文中的定時(shí)器實(shí)現要求在定時(shí)器模塊運行期間不能修改系統實(shí)際,上一版本實(shí)現則無(wú)此限制。
定時(shí)器模塊的鎖初始化為fastmutex方式,因此在回調函數里注意不能再調用CTimer的start stop reset等方法,以免死鎖,如果有調用的需求,可以把鎖修改為循環(huán)鎖recmutex方式。
 
2008/4/8補記:本文是timer的v2實(shí)現,定時(shí)器timer在業(yè)務(wù)線(xiàn)程中執行start的時(shí)候,要執行掃描排序操作,導致返回時(shí)間延長(cháng)。新的v3版本實(shí)現,定時(shí)器timer的start操作不再執行掃描操作,而是簡(jiǎn)單插入隊列頭同時(shí)置一變量表示尚未排序。定時(shí)器線(xiàn)程延遲時(shí)間到,首先掃描未排序對象,執行排序(從尾部逆向對比,根據實(shí)際使用,越晚插入的對象,超時(shí)的時(shí)間點(diǎn)越靠后,逆向則盡可能減少對比操作),再掃描判斷是否超時(shí)。詳細的代碼不發(fā)了,如果需要,可以發(fā)郵件索取。
修改的出發(fā)點(diǎn):盡量減少定時(shí)器對象操作對業(yè)務(wù)線(xiàn)程的影響。
posted on 2008-04-03 21:49 cppexplore 閱讀(1755) 評論(1)  編輯 收藏 引用

評論

# re: 【原創(chuàng )】技術(shù)系列之 定時(shí)器(二) 2008-09-16 13:41 zam
很好,能否發(fā)一個(gè)V3版本的源碼給我,非常感謝!
我的E-mail: zam1208@sohu.com  回復  更多評論
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux時(shí)間子系統之二:表示時(shí)間的單位和結構
(一)linux下的定時(shí)或計時(shí)操作(gettimeofday等的用法,秒,微妙,納秒)_鮑...
struct timeval結構體
Linux 中的計時(shí)方法
setitimer函數使用筆記 - Jiwu Bu - C++博客
linux使用select實(shí)現精確定時(shí)器詳解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久