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

CppExplore

一切像霧像雨又像風

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  29 隨筆 :: 0 文章 :: 280 評論 :: 0 Trackbacks

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

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

如果系統的頭文件中找不到,也可以自己實現下,明白這兩個結構的細節結構,實現也很簡單,這里拿timeradd舉例,其它不說了。

#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)
五、實現。和上篇文章相比,改動比較的在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);
/*加上誤差補償時間*/
    timeradd(
&now,&manager->m_repair,&stand);
    pthread_mutex_lock(
&manager->m_mutex);
    TAILQ_FOREACH(item, 
&(manager->list_), entry_){
/*取修正后的時間逐個和定時器中的超時時間點相比,遇到不超時對象則退出掃描*/
        
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){
/*循環性的要保證鏈表的順序性,如要重新插入,保存entry_的原因,是執行新的插入后不要影響當前進行的循環*/
                    tmpTimer.entry_
=item->entry_;
                    manager
->remove_timer_(item);
                    manager
->add_timer_(item);
                   item
=&tmpTimer;}
                 }

         
else break;
        }

        pthread_mutex_unlock(
&manager->m_mutex);
    }

六、源碼
寫了個簡單的makefile,執行make就可以生成測試程序:test,執行./test可以看運行效果。make由make so和make test組成,make so在lib目錄下生成libtimer.a。make clean清空。
源代碼下載這里http://m.shnenglu.com/Files/CppExplore/timer.tar.gz  [make so有問題,貌似so是關鍵字,下載后把so改下,隨意什么單詞。]
七、后記
與上一版本相比,該文中的定時器實現要求在定時器模塊運行期間不能修改系統實際,上一版本實現則無此限制。
定時器模塊的鎖初始化為fastmutex方式,因此在回調函數里注意不能再調用CTimer的start stop reset等方法,以免死鎖,如果有調用的需求,可以把鎖修改為循環鎖recmutex方式。
 
2008/4/8補記:本文是timer的v2實現,定時器timer在業務線程中執行start的時候,要執行掃描排序操作,導致返回時間延長。后續修改:
(1)定時器timer的start操作不再執行掃描操作,而是簡單插入隊列頭同時置一變量表示尚未排序。定時器線程延遲時間到,首先掃描未排序對象,執行排序(一次性timer從尾部掃描對比,循環性從頭部掃描對比),再掃描判斷是否超時。
(2)func移動到鎖外執行。
針對windows客戶端棧使用定時器不多,并且定時間隔不能受系統時間影響(客戶端的系統時間可能被修改),仍然使用v1的實現。
posted on 2008-04-03 21:49 cppexplore 閱讀(5165) 評論(10)  編輯 收藏 引用

評論

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

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

# re: 【原創】技術系列之 定時器(二) 2008-11-20 14:59 wangwb
請發跟我一份吧,學習一下,非常感謝!telventbbs@126.com  回復  更多評論
  

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

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

# re: 【原創】技術系列之 定時器(二)[未登錄] 2009-02-19 10:38 cppexplore
樓上的各位啊 歡迎來討論理論或者思想 具體到代碼細節的東西就免了,文章已經很詳細很詳細了。  回復  更多評論
  

# re: 【原創】技術系列之 定時器(二) 2009-09-28 18:04 neou
可以去看看linux的定時器實現  回復  更多評論
  

# re: 【原創】技術系列之 定時器(二)[未登錄] 2009-09-29 08:30 cppexplore
@neou
看過。
兩碼事情,8253芯片計時,os里中斷處理。  回復  更多評論
  

# re: 【原創】技術系列之 定時器(二)[未登錄] 2010-01-31 22:26 expter
linux定時器 是基于時間輪的,特別對于高性能服務器效率問題應該值得關注!

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

  回復  更多評論
  

# re: 【原創】技術系列之 定時器(二) 2010-02-01 11:36 cppexplore
@expter
的確不高,呵呵
現在換成線程獨自的定時器了,不再加鎖,容器換簡單的multimap了  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美视频一区| 亚洲激情图片小说视频| 国产精品推荐精品| 国产精品ⅴa在线观看h| 欧美精品色综合| 欧美日韩精品一区二区三区四区| 欧美成人首页| 欧美日韩亚洲一区二区三区四区| 国产精品v欧美精品∨日韩| 国产精品午夜国产小视频| 国产综合视频| 亚洲最新中文字幕| 亚洲自拍偷拍色片视频| 久久久无码精品亚洲日韩按摩| 久久er精品视频| 亚洲精品一区二区三| 欧美一级专区| 欧美日韩另类综合| 一区二区在线视频播放| 亚洲综合色网站| 久久成人综合视频| 欧美日韩国产色视频| 国产综合色产在线精品| 亚洲综合丁香| 一区二区三区精品视频| 欧美91视频| 亚洲国产精品一区二区久| 先锋资源久久| 亚洲视频狠狠| 国产精品国产三级国产普通话99| 亚洲人成绝费网站色www| 久久亚洲一区二区| 久久精品亚洲乱码伦伦中文 | 国产麻豆精品theporn| 欧美国产日韩亚洲一区| 久久精品电影| 亚洲电影激情视频网站| 欧美国产在线观看| 欧美gay视频| 一本久道久久综合狠狠爱| 亚洲国产天堂久久国产91| 欧美高清成人| 在线观看日韩专区| 欧美激情四色| 国产精品国产三级国产普通话蜜臀 | 亚洲女性裸体视频| 亚洲欧美国产77777| 亚洲精选久久| 欧美国产激情二区三区| 欧美日韩国产综合网 | 国产一区二区精品久久91| 久久久精品日韩| 欧美国产日韩在线观看| 亚洲欧美国产制服动漫| 久久精品国产一区二区电影 | 国产精品区二区三区日本| 久久国产黑丝| 国产精品久久久久9999吃药| 美女国产精品| 国产麻豆精品theporn| 欧美激情一区二区三区四区| 国产精品免费久久久久久| 欧美好吊妞视频| 国产亚洲午夜高清国产拍精品| 最新中文字幕亚洲| 国内精品亚洲| 亚洲女同精品视频| 亚洲综合日韩中文字幕v在线| 欧美成人久久| 亚洲福利在线看| 99re热这里只有精品视频| 免费视频一区二区三区在线观看| 久久先锋影音av| 中文一区二区在线观看| 一区二区欧美日韩| 欧美日韩三级一区二区| 99av国产精品欲麻豆| 亚洲一区二区动漫| 国产精品自拍在线| 久久色在线观看| 亚洲第一搞黄网站| 免费日韩视频| 亚洲日本欧美天堂| 亚洲欧美成人一区二区三区| 国产精品日韩一区二区| 久久国产精品电影| 亚洲精品久久久久| 久久精品天堂| 国产精品99久久久久久久vr| 国产乱码精品一区二区三区av| 久久精品99| 亚洲精品日韩欧美| 欧美一区二区三区四区在线| 国外成人在线视频| 久久久久成人精品免费播放动漫| 国产视频综合在线| 欧美精品亚洲一区二区在线播放| 在线视频一区二区| 欧美高清自拍一区| 久久精品国产亚洲a| 亚洲男女自偷自拍图片另类| 亚洲精品一线二线三线无人区| 欧美日韩一区三区| 欧美国产一区视频在线观看| 欧美一区二区日韩| 在线亚洲电影| 日韩视频中文| 91久久久久久久久| 亚洲高清不卡av| 欧美大片免费看| 欧美岛国激情| 欧美国产日韩一区| 国产精品美女一区二区| 欧美午夜久久久| 国产欧美精品在线| 国产一区二区三区在线观看免费视频| 国产精品无人区| 国产亚洲精品一区二555| 国产一区二区三区在线观看免费视频 | 国产一区二区久久久| 国产一区二区| 亚洲电影成人| 中日韩在线视频| 欧美综合77777色婷婷| 久久久久这里只有精品| 亚洲高清在线播放| 在线综合亚洲欧美在线视频| 亚洲综合好骚| 女人天堂亚洲aⅴ在线观看| 欧美电影资源| 精品粉嫩aⅴ一区二区三区四区| 亚洲欧洲精品一区二区三区| 一区二区三区欧美在线观看| 新67194成人永久网站| 亚洲电影免费在线观看| 欧美一区二区三区久久精品 | 久久精品国产综合| 欧美久久久久久蜜桃| 一区二区在线视频播放| 亚洲欧美激情一区| 亚洲精品永久免费| 欧美乱妇高清无乱码| 国内偷自视频区视频综合| 亚洲欧美久久| 亚洲国产综合在线| 久久久精品国产一区二区三区| 一区二区三区国产盗摄| 欧美电影免费观看| 亚洲精品国产精品国自产在线 | 亚洲欧美一区二区三区极速播放| 牛人盗摄一区二区三区视频| 午夜亚洲福利在线老司机| 国产精品午夜av在线| 欧美一级片一区| 午夜精彩视频在线观看不卡| 亚洲视频免费在线观看| 国产精品网站视频| 欧美专区日韩专区| 久久综合网络一区二区| 亚洲狠狠丁香婷婷综合久久久| 欧美成人国产va精品日本一级| 久久综合九色综合欧美狠狠| 亚洲精品乱码久久久久| 国产精品婷婷午夜在线观看| 日韩视频精品在线| 在线亚洲+欧美+日本专区| 国产亚洲一区二区三区在线播放 | 红桃视频欧美| 91久久精品国产| 欧美日韩国产小视频| 国产精品99久久久久久久久 | 亚洲精品日韩综合观看成人91| 欧美日韩国产在线| 久久久亚洲一区| 国产精品一区二区久久久久| 久久免费少妇高潮久久精品99| 欧美精品一区二区三区高清aⅴ| 欧美在线1区| 国产精品ⅴa在线观看h| 亚洲激情成人| 9人人澡人人爽人人精品| 亚洲在线电影| 欧美精品一区二区在线播放| 久久综合色影院| 国产一区日韩二区欧美三区| 香蕉视频成人在线观看| 午夜视频一区在线观看| 国产精品女人久久久久久| 亚洲精品乱码久久久久久蜜桃麻豆| 国内精品久久久久久久影视蜜臀| 亚洲午夜在线视频| 亚洲资源av| 国产亚洲精品久久久久动| 性色av香蕉一区二区| 久久久激情视频| 亚洲国产婷婷综合在线精品| 亚洲免费网站| 国产一区二区高清视频| 久久九九热re6这里有精品| 久久久在线视频|