• <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)單線程池的實(shí)現(xiàn)

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

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

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

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

                     1.線程池管理器(ThreadPoolManager):用于創(chuàng)建并管理線程池 
                     2.工作線程(WorkThread): 線程池中線程 
                     3.任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行。
                     4.任務(wù)隊(duì)列:用于存放沒(méi)有處理的任務(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            /// 對(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è)線程
            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        /// 線程信息
            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        /// 線程運(yùn)行狀態(tài)
            210        volatile bool                tpool_running_;
            211        /// 一個(gè)臨界區(qū)類
            212        sync::csectionlock            tlock_;                
            213        /// 線程信息
            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
                            線程池設(shè)計(jì)                  http://www.ibm.com/developerworks/cn/java/l-threadPool/

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

            評(píng)論

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


            色综合久久夜色精品国产| 久久人人超碰精品CAOPOREN | 人妻无码αv中文字幕久久| 久久久久久亚洲精品无码| 久久久久久亚洲精品影院| 中文字幕无码免费久久| 久久九九有精品国产23百花影院| 国产精品久久久99| 国产亚洲综合久久系列| 久久婷婷五月综合色99啪ak| 亚洲人成无码久久电影网站| 日韩人妻无码一区二区三区久久| 精品久久777| 国产精品久久久久久久久久影院| A级毛片无码久久精品免费| 亚洲AV日韩精品久久久久久| 91精品国产91热久久久久福利 | 无码人妻久久一区二区三区蜜桃| 亚洲va中文字幕无码久久 | 伊人 久久 精品| 色噜噜狠狠先锋影音久久| 伊人热热久久原色播放www| av无码久久久久不卡免费网站| 中文字幕无码久久人妻| 久久精品国产精品国产精品污 | 日韩精品久久久久久| 亚洲AV无码久久寂寞少妇| 欧美国产精品久久高清| 国产精品熟女福利久久AV| 国产精品久久毛片完整版| 一本色道久久88精品综合| 亚洲国产精品无码久久久久久曰| 亚洲国产精品久久久久| 久久精品国产亚洲av日韩| 亚洲AV无码久久精品狠狠爱浪潮| 久久久久亚洲国产| 免费久久人人爽人人爽av| 久久久黄色大片| 一本久道久久综合狠狠爱| 亚洲欧美伊人久久综合一区二区| 久久精品国产亚洲AV久|