青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

CppExplore

一切像霧像雨又像風(fēng)

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  29 隨筆 :: 0 文章 :: 280 評(píng)論 :: 0 Trackbacks

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

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

對(duì)struct timespec同樣有timespecadd/timespecsub/timespeccmp,另外還有兩者的轉(zhuǎn)換宏,使用函數(shù)原型的方式理解就是:

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

如果系統(tǒng)的頭文件中找不到,也可以自己實(shí)現(xiàn)下,明白這兩個(gè)結(jié)構(gòu)的細(xì)節(jié)結(jié)構(gòu),實(shí)現(xiàn)也很簡(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í)現(xiàn)。和上篇文章相比,改動(dòng)比較的在add_timer_和process方法。當(dāng)前add_timer_操作需要順序掃描插入到合適的位置以保持鏈表的順序。當(dāng)前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);
/*加上誤差補(bǔ)償時(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í)對(duì)象則退出掃描*/
        
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_的原因,是執(zhí)行新的插入后不要影響當(dāng)前進(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,執(zhí)行make就可以生成測(cè)試程序:test,執(zhí)行./test可以看運(yùn)行效果。make由make so和make test組成,make so在lib目錄下生成libtimer.a。make clean清空。
源代碼下載這里http://m.shnenglu.com/Files/CppExplore/timer.tar.gz  [make so有問(wèn)題,貌似so是關(guān)鍵字,下載后把so改下,隨意什么單詞。]
七、后記
與上一版本相比,該文中的定時(shí)器實(shí)現(xiàn)要求在定時(shí)器模塊運(yùn)行期間不能修改系統(tǒng)實(shí)際,上一版本實(shí)現(xiàn)則無(wú)此限制。
定時(shí)器模塊的鎖初始化為fastmutex方式,因此在回調(diào)函數(shù)里注意不能再調(diào)用CTimer的start stop reset等方法,以免死鎖,如果有調(diào)用的需求,可以把鎖修改為循環(huán)鎖recmutex方式。
 
2008/4/8補(bǔ)記:本文是timer的v2實(shí)現(xiàn),定時(shí)器timer在業(yè)務(wù)線(xiàn)程中執(zhí)行start的時(shí)候,要執(zhí)行掃描排序操作,導(dǎo)致返回時(shí)間延長(zhǎng)。后續(xù)修改:
(1)定時(shí)器timer的start操作不再執(zhí)行掃描操作,而是簡(jiǎn)單插入隊(duì)列頭同時(shí)置一變量表示尚未排序。定時(shí)器線(xiàn)程延遲時(shí)間到,首先掃描未排序?qū)ο螅瑘?zhí)行排序(一次性timer從尾部掃描對(duì)比,循環(huán)性從頭部掃描對(duì)比),再掃描判斷是否超時(shí)。
(2)func移動(dòng)到鎖外執(zhí)行。
針對(duì)windows客戶(hù)端棧使用定時(shí)器不多,并且定時(shí)間隔不能受系統(tǒng)時(shí)間影響(客戶(hù)端的系統(tǒng)時(shí)間可能被修改),仍然使用v1的實(shí)現(xiàn)。
posted on 2008-04-03 21:49 cppexplore 閱讀(5183) 評(píng)論(10)  編輯 收藏 引用

評(píng)論

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二) 2008-09-16 13:41 zam
很好,能否發(fā)一個(gè)V3版本的源碼給我,非常感謝!
我的E-mail: zam1208@sohu.com  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二) 2008-10-13 16:11 薛軍
我也想要一份V3版本的源碼,謝謝!xj181818◎163.com
  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二) 2008-11-20 14:59 wangwb
請(qǐng)發(fā)跟我一份吧,學(xué)習(xí)一下,非常感謝!telventbbs@126.com  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二) 2008-12-08 21:51 liujingnan
我也想要一份V3版,多謝了。liujingnan829@163.com  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二) 2009-02-06 17:06 nihao
大俠,能不能也給我發(fā)一份v3版本的源碼呀。xujie@m165.com
多謝!!!!!!!!!!!!  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二)[未登錄](méi) 2009-02-19 10:38 cppexplore
樓上的各位啊 歡迎來(lái)討論理論或者思想 具體到代碼細(xì)節(jié)的東西就免了,文章已經(jīng)很詳細(xì)很詳細(xì)了。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二) 2009-09-28 18:04 neou
可以去看看linux的定時(shí)器實(shí)現(xiàn)  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二)[未登錄](méi) 2009-09-29 08:30 cppexplore
@neou
看過(guò)。
兩碼事情,8253芯片計(jì)時(shí),os里中斷處理。  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二)[未登錄](méi) 2010-01-31 22:26 expter
linux定時(shí)器 是基于時(shí)間輪的,特別對(duì)于高性能服務(wù)器效率問(wèn)題應(yīng)該值得關(guān)注!

你的插入add_timer 還是單鏈表的排序插入,效率不是很高!
:)

  回復(fù)  更多評(píng)論
  

# re: 【原創(chuàng)】技術(shù)系列之 定時(shí)器(二) 2010-02-01 11:36 cppexplore
@expter
的確不高,呵呵
現(xiàn)在換成線(xiàn)程獨(dú)自的定時(shí)器了,不再加鎖,容器換簡(jiǎn)單的multimap了  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产高潮在线观看| 激情久久婷婷| 最新精品在线| 欧美高清视频在线| 欧美黄色aaaa| 亚洲欧洲三级电影| 日韩系列在线| 亚洲香蕉在线观看| 亚洲欧美综合另类中字| 久久精品99无色码中文字幕| 欧美在线综合| 免费看黄裸体一级大秀欧美| 欧美精品一区在线观看| 国产精品美女久久久免费| 国产亚洲毛片在线| 亚洲激情网站免费观看| 亚洲一区亚洲| 久久伊人免费视频| 亚洲欧美日韩中文在线制服| 久久婷婷国产综合精品青草| 久久中文在线| 欧美激情在线观看| 国产美女精品一区二区三区 | 蜜桃伊人久久| 欧美激情视频在线播放| 国产精品美女www爽爽爽| 国内久久视频| 在线视频欧美日韩精品| 久久精品欧美| 亚洲美女中文字幕| 久久久99精品免费观看不卡| 欧美精品一区二区三| 国产一区欧美日韩| 一本色道久久综合精品竹菊| 久久久高清一区二区三区| 91久久午夜| 久久久精品网| 国产精品久久久久9999吃药| 亚洲国产成人在线播放| 欧美综合国产| 夜夜嗨一区二区| 欧美成人一区二区在线 | 亚洲人成网站在线观看播放| 亚洲欧美日韩国产精品| 亚洲大片在线| 久久精品国产一区二区电影| 国产精品成人一区二区三区吃奶| 亚洲福利视频网| 久久久综合网| 欧美一级二区| 国产精品无人区| 亚洲私人影院在线观看| 亚洲国产精品一区二区www在线| 欧美一区综合| 国产欧美一区二区三区在线老狼| 国产精品99久久久久久久久| 亚洲高清123| 麻豆精品视频| 亚洲人成毛片在线播放| 亚洲国产精品悠悠久久琪琪| 蜜桃av噜噜一区二区三区| 亚洲第一精品福利| 欧美fxxxxxx另类| 欧美粗暴jizz性欧美20| 亚洲国产裸拍裸体视频在线观看乱了中文 | 日韩一二三区视频| 久久这里只有| 久久久久久自在自线| 亚洲国产你懂的| 久久尤物视频| 韩国v欧美v日本v亚洲v| 久久久久九九九| 欧美一区影院| 狠狠做深爱婷婷久久综合一区| 久久aⅴ国产欧美74aaa| 久久精品主播| 亚洲国产精品福利| 亚洲人成人一区二区三区| 欧美人成在线视频| 亚洲一区二区三区国产| 亚洲一区二区在线视频| 国产亚洲精品v| 欧美激情性爽国产精品17p| 美女爽到呻吟久久久久| 一本久久综合亚洲鲁鲁五月天| 亚洲免费观看高清完整版在线观看熊| 欧美日韩和欧美的一区二区| 午夜视频一区| 噜噜噜躁狠狠躁狠狠精品视频| 日韩午夜在线观看视频| 一区二区三区欧美激情| 国产伦精品一区| 免费久久99精品国产| 欧美精彩视频一区二区三区| 亚洲综合日韩在线| 久久人人97超碰精品888| 日韩一区二区精品葵司在线| 亚洲伊人网站| 亚洲精品免费一二三区| 亚洲午夜精品久久久久久浪潮| 国产综合av| 亚洲日韩中文字幕在线播放| 国产精品裸体一区二区三区| 狂野欧美性猛交xxxx巴西| 欧美日韩精品免费 | 亚洲成在线观看| 亚洲欧洲中文日韩久久av乱码| 国产精品女人网站| 欧美成人综合| 国产亚洲毛片在线| 亚洲另类在线视频| 亚洲第一网站| 午夜久久久久| 亚洲视频欧美视频| 美女精品自拍一二三四| 欧美怡红院视频一区二区三区| 久久综合狠狠| 久久久国产一区二区| 欧美日韩天堂| 亚洲第一页中文字幕| 国内精品久久久久伊人av| 中文在线资源观看网站视频免费不卡| 亚洲国产高清在线观看视频| 午夜精品国产精品大乳美女| 一本色道久久综合亚洲精品婷婷| 久久久久www| 久久久久se| 国产欧美日韩综合一区在线播放| 亚洲国产高清在线| 亚洲综合欧美| 亚洲综合第一页| 亚洲视频在线观看视频| 久久女同互慰一区二区三区| 欧美在线视频不卡| 国产精品三级视频| 亚洲一区二区三区免费在线观看 | 一本大道av伊人久久综合| 久久综合色播五月| 免费久久99精品国产自在现线| 国产午夜一区二区三区| 亚洲综合电影| 久久精品99国产精品酒店日本| 国产精品成人一区二区网站软件| 亚洲精品中文字幕在线| 亚洲图片欧美一区| 国产精品国色综合久久| 亚洲欧美在线播放| 久久久www| 亚洲国产成人精品久久久国产成人一区 | 一本久久综合| 国产精品a久久久久久| 一道本一区二区| 羞羞漫画18久久大片| 国产免费观看久久| 久久久久91| 亚洲国产一区二区精品专区| 99re视频这里只有精品| 欧美性猛交一区二区三区精品| 亚洲免费婷婷| 免费观看30秒视频久久| 亚洲看片网站| 国产精品爽黄69| 久久婷婷激情| 日韩午夜在线观看视频| 午夜精品免费| 精品成人a区在线观看| 欧美激情1区2区| 亚洲欧美视频一区| 欧美国产先锋| 亚洲一区二区三区精品视频 | 黄色成人精品网站| 欧美日韩国产精品自在自线| 亚洲在线观看免费| 欧美成人午夜激情在线| 在线亚洲观看| 国产一区视频在线观看免费| 免费看av成人| 羞羞答答国产精品www一本| 亚洲国产欧美日韩另类综合| 欧美一区亚洲二区| 9人人澡人人爽人人精品| 国产色产综合产在线视频| 欧美激情视频网站| 欧美在线亚洲| 在线视频亚洲一区| 91久久亚洲| 猛男gaygay欧美视频| 午夜久久福利| 亚洲免费大片| 在线激情影院一区| 国产欧美成人| 国产精品久久久久久影视 | 日韩一级在线观看| 欧美日韩午夜在线| 久久久久久一区二区三区| 中日韩高清电影网| 亚洲人成在线播放| 免费日韩av片| 久热精品视频在线| 久久se精品一区二区|