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

勤能補(bǔ)拙,Expter

成都游戲Coder,記錄游戲開發(fā)過程的筆記和心得!

一個簡單線程池的實現(xiàn)

        以前寫線程池是在網(wǎng)絡(luò)編程的時候,一個線程池處理一個網(wǎng)絡(luò)套接字,隨著連接的增多,效率很低,
        最近主要是在封裝一個ipc程序(進(jìn)程間通信機(jī)制) 主要
    涉及的技術(shù):  
    Winsock, 線程池

    因為光是基于線程池的技術(shù)效率還是很低,打算重新把其代碼整理重新封裝通過,在此基礎(chǔ)上通過完成端口來封裝一個簡單的高并發(fā)服務(wù)器。

    可能涉及的技術(shù)
    Winsock:   windows網(wǎng)絡(luò)通信
    完成端口:   Windows上服務(wù)器的大規(guī)模連接機(jī)制。
    線程池:    高效高利用率的線程機(jī)制。

        本文主要實現(xiàn)一個線程池的例子,從基本原理入手,一個線程池會記錄每個線程的信息,以及每個線程的處理。
         一般一個簡單線程池至少包含下列組成部分。

         1.線程池管理器(ThreadPoolManager):用于創(chuàng)建并管理線程池 
         2.工作線程(WorkThread): 線程池中線程 
         3.任務(wù)接口(Task):每個任務(wù)必須實現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行。
         4.任務(wù)隊列:用于存放沒有處理的任務(wù)。提供一種緩沖機(jī)制。 
         
       

  1#pragma once
  2
  3#include "lock.h"
  4
  5/// 線程池
  6namespace tp_ipc_peer_namespace
  7{
  8    /// 接口
  9    class task_object
 10    {
 11    public:
 12        virtual ~task_object(){}
 13        virtual void exec() = 0;
 14    }
;
 15
 16    template< typename Functor>
 17    class task 
 18        : public task_object
 19    {
 20
 21        /// 禁止操作
 22    private:
 23        task( const task &);
 24        task & operator =const task & );
 25
 26    public:
 27        typedef Functor functor_type;
 28
 29        task( const functor_type & functor)
 30            : functor_( functor )
 31        { }
 32
 33        /// 執(zhí)行
 34        virtual void exec()
 35        {
 36            functor_();
 37        }

 38
 39    private:
 40        Functor functor_;
 41        
 42    }
;
 43
 44    class ctpool
 45    {
 46        typedef ctpool self_type;
 47        
 48    public:
 49        ctpool(void)
 50            :tpool_running_( true )
 51        
 52            _m_start_threads( 1 );
 53        }

 54        ctpool ( unsigned threadsize )
 55            :tpool_running_(true)
 56        {
 57            _m_start_threads( threadsize );
 58        }

 59
 60        template< typename Function>
 61        void push( const Function & f)
 62        {
 63            /// 枷鎖
 64            task_lock_.enter();
 65
 66            task_container_.push_back( new tp_ipc_peer_namespace::task<Function>( f ) );
 67            
 68            task_lock_.leave();
 69
 70        }

 71        
 72        ~ctpool(void){}
 73
 74    private:
 75
 76        /// 創(chuàng)建線程池
 77        void _m_start_threads( unsigned size )
 78        {
 79            if ( size == 0 )
 80                size = 4;
 81
 82            for ( unsigned i = 0 ; i < size ; i++)
 83            {
 84                tinfo_type tinfo;
 85                tinfo.state = 0;
 86                tinfo.handle = (HANDLE)::_beginthreadex( 0 , 0 , _m_work_thread , NULL , NULL ,&(tinfo.tid) );
 87                threads_.push_back(  tinfo );
 88            }

 89        }

 90        
 91        /// 喚醒
 92        void _m_wakeup()
 93        {
 94            HANDLE handle = 0;
 95
 96            /// 對共享區(qū) 枷鎖
 97            tlock_.enter();
 98            std::vector<tinfo_type>::iterator it = threads_.begin(), end = threads_.end();
 99
100            for ( ; it != end ; ++it )
101            {
102                if ( it->state == 0 ) /// 在等待狀態(tài)
103                {
104                    handle      =  it->handle ;
105                    it->state = 1;
106                    break;
107                }

108            }

109            tlock_.leave();
110
111            while ( ::ResumeThread( handle ) != 1)
112                ;
113        }

114
115        /// 掛起某個線程
116        void _m_suspend()
117        {
118            unsigned tid = ::GetCurrentThreadId();
119            HANDLE   handle = 0;
120
121            tlock_.enter();
122
123            /// 對共享區(qū) 枷鎖
124            tlock_.enter();
125            std::vector<tinfo_type>::iterator it = threads_.begin(), end = threads_.end();
126
127            for ( ; it != end ; ++it )
128            {
129                if ( it->tid == tid ) /// 運行ID
130                {
131                    handle      =  it->handle ;
132                    it->state = 0;
133                    break;
134                }

135            }

136            tlock_.leave();
137
138            /// 掛起
139            if ( handle)
140            {
141                ::SuspendThread( handle );
142            }

143        }

144
145        /// 獲取task
146        tp_ipc_peer_namespace::task_object * _m_read_task()
147        {
148            while( tpool_running_ )
149            {
150                tp_ipc_peer_namespace::task_object * task = NULL;
151                
152                /// 對共享區(qū) 枷鎖
153                task_lock_.enter();
154                if ( task_container_.size() )
155                {
156                    task = *( task_container_.begin() );
157                    task_container_.erase( task_container_.begin() );
158                }

159                task_lock_.leave();
160
161                if ( task )
162                {
163                    return task;
164                }

165                else
166                    _m_suspend();
167            }

168            return NULL;
169        }

170
171    private:
172        static  unsigned __stdcall _m_work_thread(void * arg)
173        {
174            
175            self_type & self = *reinterpret_cast<self_type*>(arg);
176            tp_ipc_peer_namespace::task_object * task = 0;
177
178            ::SuspendThread(::GetCurrentThread());
179
180            whiletrue )
181            {
182                task = self._m_read_task();
183                if ( task )
184                {
185                    task->exec();
186
187                    delete task ;
188                    task = 0;
189                }

190                else
191                    break;
192            }

193            
194            ::_endthreadex( 0 );
195            return 0;
196        }

197
198    private:
199        /// 線程信息
200        struct tinfo_type
201        {
202            HANDLE            handle;
203            unsigned        tid;
204            unsigned long    state;  // 0 = sleep;
205        }
;
206
207        /// user define var
208    private:
209        /// 線程運行狀態(tài)
210        volatile bool                tpool_running_;
211        /// 一個臨界區(qū)類
212        sync::csectionlock            tlock_;                
213        /// 線程信息
214        std::vector<tinfo_type>        threads_;        
215        /// 
216        sync::csectionlock            task_lock_;
217        /// 一個回調(diào)函數(shù)
218        std::vector<task_object* > task_container_;
219
220    }
;
221
222
223}





       備注:在設(shè)計ipc的時候參考  http://man.chinaunix.net/tech/lyceum/linuxK/ipc/ipc.html
                線程池設(shè)計                  http://www.ibm.com/developerworks/cn/java/l-threadPool/

posted on 2009-08-09 18:10 expter 閱讀(4220) 評論(8)  編輯 收藏 引用

評論

# re: 一個簡單線程池的實現(xiàn)[未登錄] 2009-08-10 01:57 fox

不用線程,只是select輪詢又如何?不見得性能很差。  回復(fù)  更多評論   

# re: 一個簡單線程池的實現(xiàn) 2009-08-10 09:19 abettor

@fox
select的話,如果進(jìn)程同時占用的socket超過100,效率將顯著下降。
另外select模型畢竟還是串行操作,無法做到真正的recv/send并行。  回復(fù)  更多評論   

# re: 一個簡單線程池的實現(xiàn)[未登錄] 2009-08-10 17:57 欲三更

你一個線程select幾十個不就行了?  回復(fù)  更多評論   

# re: 一個簡單線程池的實現(xiàn) 2009-08-10 19:43 expter

@fox
select模型 確實能提高效率,我這里只是介紹一個線程池,他是我在處理IPC機(jī)制的一個模型  回復(fù)  更多評論   

# re: 一個簡單線程池的實現(xiàn) 2010-02-25 14:11 tcpcoder

都是epoll的年代了,還select-_-!  回復(fù)  更多評論   

# re: 一個簡單線程池的實現(xiàn) 2010-04-07 23:00 asuran

如果你只需要1~2個socket 連接select 還是很不錯的, 比如客戶端

如果需要handle大量的鏈接, 如服務(wù)器端, 用 IOCP /EPOLL/BOOST。ASIO
所以需要case by case, 不能一概而論  回復(fù)  更多評論   

# re: 一個簡單線程池的實現(xiàn) 2011-10-26 17:47 wishper

這代碼 應(yīng)該不是你寫的吧.只是把人家的代碼拿來該了幾個namespace
  回復(fù)  更多評論   

# re: 一個簡單線程池的實現(xiàn) 2013-01-30 10:27 clement

這線程池寫的不咋地。能運行嗎?  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   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>
            亚洲一区二区三区高清 | 久久久久国内| 亚洲一区二区视频在线观看| 欧美日韩一区二区三区四区在线观看 | 99国产精品私拍| 亚洲精品一区二区三区99| 欧美精品乱码久久久久久按摩| 亚洲日韩成人| 亚洲小说春色综合另类电影| 国产一区二区三区高清在线观看 | 性色一区二区三区| 久久成人精品电影| 亚洲精品乱码久久久久| 在线亚洲一区观看| 在线播放亚洲一区| 亚洲精品色图| 国产一区自拍视频| 亚洲国产精品一区二区www在线| 欧美成人日韩| 欧美一区二区三区免费视频| 久久综合99re88久久爱| 午夜激情综合网| 老司机午夜精品视频| 亚洲尤物在线视频观看| 久久一区二区视频| 亚洲欧美日韩综合国产aⅴ| 久久精品女人的天堂av| 亚洲尤物精选| 亚洲一二三级电影| 免费亚洲一区| 国产精品乱码一区二区三区| 女女同性精品视频| 国产欧美91| 亚洲精品一区二区三区蜜桃久 | 国产精品久久久久久久久久久久久| 久久国产精品久久久久久| 欧美精品二区三区四区免费看视频| 欧美一区二区三区精品| 免费亚洲一区二区| 久久性色av| 国产日韩欧美a| 中文亚洲视频在线| 一本一道久久综合狠狠老精东影业| 久久福利视频导航| 欧美有码在线观看视频| 欧美三级资源在线| 亚洲精品美女在线观看播放| 国模私拍视频一区| 亚洲欧美日韩系列| 亚洲欧美日韩国产一区二区三区| 欧美精品三区| 亚洲激情在线观看视频免费| 亚洲国产成人91精品| 久久久久青草大香线综合精品| 欧美尤物一区| 国产欧美日韩中文字幕在线| 亚洲无亚洲人成网站77777 | 国产一区二区视频在线观看| 亚洲欧美一级二级三级| 羞羞答答国产精品www一本| 欧美久久久久| 一本色道久久88精品综合| 一区二区免费看| 欧美日韩亚洲激情| 在线视频亚洲| 欧美制服丝袜| 国产视频一区三区| 欧美一区2区三区4区公司二百 | 在线综合亚洲| 国产精品美女在线观看| 国产欧美一区二区三区国产幕精品| 亚洲午夜激情免费视频| 欧美在线视频一区| 狠狠色综合色区| 久久亚洲免费| 亚洲精品美女免费| 欧美一区二区三区播放老司机| 国产麻豆精品视频| 久久久久久久性| 亚洲日本成人网| 先锋资源久久| 亚洲电影免费观看高清完整版在线观看| 久久久久五月天| 日韩视频亚洲视频| 欧美中文字幕不卡| 在线视频国内自拍亚洲视频| 欧美二区视频| 亚洲一区影院| 亚洲第一在线视频| 亚洲欧美日韩精品综合在线观看| 国产精品一级| 久久国产精品一区二区三区| 国产精品乱码人人做人人爱| 久久成人精品视频| 亚洲美女视频| 麻豆精品视频在线| 国产精品99久久久久久久久久久久| 国产毛片精品视频| 欧美顶级艳妇交换群宴| 午夜精品美女自拍福到在线 | 久久精品国产亚洲精品| 影院欧美亚洲| 国产精品美女主播| 欧美激情视频给我| 欧美一级淫片播放口| 亚洲裸体在线观看| 欧美成年人在线观看| 亚洲欧美日韩成人| 亚洲精品裸体| 国内精品久久久久久久果冻传媒| 欧美激情影院| 久久夜色精品国产| 亚洲欧洲av一区二区| 日韩视频在线免费观看| 欧美福利视频在线| 久久亚洲午夜电影| 亚洲欧美日韩一区二区在线| 亚洲精品久久久蜜桃| 在线成人中文字幕| 国产欧美一区在线| 国产精品久久久久一区二区三区 | 国产精品久久看| 欧美日韩亚洲一区二区三区四区| 久久久一区二区| 久久国产99| 欧美制服丝袜| 午夜精品影院| 亚洲欧美中文另类| 在线视频精品| 日韩天堂av| 99国产一区| 亚洲毛片在线看| 亚洲精品视频在线看| 亚洲精品国久久99热| 亚洲国产精品激情在线观看| 免费在线亚洲| 欧美激情一区二区三区在线| 欧美xx69| 亚洲国产精品久久久久婷婷老年| 欧美jizzhd精品欧美巨大免费| 久久综合一区二区| 欧美成人免费小视频| 欧美国产日韩亚洲一区| 亚洲二区在线| 日韩视频免费观看| 一本色道久久精品| 亚洲欧美国产毛片在线| 亚洲欧美高清| 久久精品视频在线观看| 麻豆久久婷婷| 欧美另类69精品久久久久9999| 欧美精品观看| 国产精品久久久久久久久久ktv | 午夜精彩国产免费不卡不顿大片| 亚洲综合日韩中文字幕v在线| 午夜精品区一区二区三| 久久精品99| 欧美激情视频网站| 99精品欧美| 午夜一区二区三区不卡视频| 久久精品视频网| 欧美精品v日韩精品v韩国精品v| 欧美三级在线| 99国产精品久久久久老师| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲黄色在线观看| 午夜精品一区二区三区在线 | 最近中文字幕日韩精品| 99国产精品私拍| 久久国产视频网站| 欧美激情国产高清| 国产午夜精品视频免费不卡69堂| 亚洲国产精品久久久久婷婷884| 亚洲视频中文字幕| 久久男人资源视频| 亚洲精品乱码久久久久久黑人 | 中日韩美女免费视频网站在线观看| 性刺激综合网| 欧美精品在线极品| 国产综合在线看| 亚洲少妇诱惑| 欧美不卡视频一区| 中国日韩欧美久久久久久久久| 久久综合狠狠| 国产三级欧美三级| 亚洲少妇在线| 亚洲高清视频在线观看| 亚洲欧美一区二区三区极速播放| 欧美成人精品影院| 国内自拍亚洲| 亚洲欧美日韩中文播放| 亚洲国产1区| 久久久久久穴| 国产日韩欧美二区| 亚洲一区二区三区三| 亚洲大片精品永久免费| 久久精品欧美| 国内不卡一区二区三区| 亚洲在线观看视频| 一片黄亚洲嫩模|