• <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>

            勤能補(bǔ)拙,Expter

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

            一個(gè)簡(jiǎn)單線(xiàn)程池的實(shí)現(xiàn)

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

                因?yàn)楣馐腔诰€(xiàn)程池的技術(shù)效率還是很低,打算重新把其代碼整理重新封裝通過(guò),在此基礎(chǔ)上通過(guò)完成端口來(lái)封裝一個(gè)簡(jiǎn)單的高并發(fā)服務(wù)器。

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

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

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

              1#pragma once
              2
              3#include "lock.h"
              4
              5/// 線(xiàn)程池
              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)建線(xiàn)程池
             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            /// 對(duì)共享區(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        /// 掛起某個(gè)線(xiàn)程
            116        void _m_suspend()
            117        {
            118            unsigned tid = ::GetCurrentThreadId();
            119            HANDLE   handle = 0;
            120
            121            tlock_.enter();
            122
            123            /// 對(duì)共享區(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 ) /// 運(yùn)行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                /// 對(duì)共享區(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        /// 線(xiàn)程信息
            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        /// 線(xiàn)程運(yùn)行狀態(tài)
            210        volatile bool                tpool_running_;
            211        /// 一個(gè)臨界區(qū)類(lèi)
            212        sync::csectionlock            tlock_;                
            213        /// 線(xiàn)程信息
            214        std::vector<tinfo_type>        threads_;        
            215        /// 
            216        sync::csectionlock            task_lock_;
            217        /// 一個(gè)回調(diào)函數(shù)
            218        std::vector<task_object* > task_container_;
            219
            220    }
            ;
            221
            222
            223}





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

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

            評(píng)論

            # re: 一個(gè)簡(jiǎn)單線(xiàn)程池的實(shí)現(xiàn)[未登錄](méi) 2009-08-10 01:57 fox

            不用線(xiàn)程,只是select輪詢(xún)又如何?不見(jiàn)得性能很差。  回復(fù)  更多評(píng)論   

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

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

            # re: 一個(gè)簡(jiǎn)單線(xiàn)程池的實(shí)現(xiàn)[未登錄](méi) 2009-08-10 17:57 欲三更

            你一個(gè)線(xiàn)程select幾十個(gè)不就行了?  回復(fù)  更多評(píng)論   

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

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

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

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

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

            如果你只需要1~2個(gè)socket 連接select 還是很不錯(cuò)的, 比如客戶(hù)端

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

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

            這代碼 應(yīng)該不是你寫(xiě)的吧.只是把人家的代碼拿來(lái)該了幾個(gè)namespace
              回復(fù)  更多評(píng)論   

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

            這線(xiàn)程池寫(xiě)的不咋地。能運(yùn)行嗎?  回復(fù)  更多評(píng)論   


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


            久久噜噜电影你懂的| 久久综合久久伊人| 久久综合狠狠色综合伊人| 久久久久久无码国产精品中文字幕 | 91久久成人免费| 亚洲欧美成人久久综合中文网 | 一本久久综合亚洲鲁鲁五月天| 人妻无码αv中文字幕久久| 欧美国产成人久久精品| 99久久99久久精品免费看蜜桃| 人妻少妇精品久久| 欧美亚洲另类久久综合| 亚洲中文久久精品无码ww16| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久精品国内一区二区三区| 婷婷久久综合九色综合九七| 国产精品久久久久aaaa| 精品久久久久久久国产潘金莲| 中文字幕亚洲综合久久2| 日韩人妻无码精品久久久不卡| 中文字幕精品久久| 久久精品夜色噜噜亚洲A∨| 精品久久8x国产免费观看| 国内精品久久久久影院老司| 久久久久亚洲精品中文字幕| 国产精品亚洲美女久久久| 久久99热精品| 99久久成人国产精品免费| 亚洲国产精品无码久久98| 99精品久久精品一区二区| 亚洲性久久久影院| 亚洲国产精品无码久久青草| 亚洲а∨天堂久久精品| 午夜精品久久影院蜜桃| 亚洲精品tv久久久久久久久久| 亚洲人成无码www久久久| 武侠古典久久婷婷狼人伊人| 亚洲国产成人久久笫一页| 国产成人综合久久精品红| 国产精品久久久久蜜芽| 97精品伊人久久久大香线蕉|