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

隨筆-167  評論-8  文章-0  trackbacks-0
這是一個基于ACE的線程庫實現,屬于半同步半異步類型的線程池,感覺實現得非常優雅,代碼是由網上下的好幾份代碼拼湊而成的(ACE的源碼包中的tests目錄下有大量的實例,研究這些例子是學習ACE的好辦法,只是由于注釋都是一堆堆的英文,有時候感覺頭疼,就懶得去看它了)。這個線程池由一個線程池管理器管理著五個線程來處理消息,當五個處理線程都在處理消息時,接收新的消息將導致線程管理器被阻塞。消息處理線程處理完發給自己的消息后將被阻塞,其將重新被管理器管理器放入隊列中。越發感覺到ACE的強大,只可惜我們的程序用不上。一個原因是我們程序本身處理的數據量并不會太大;另外我們的程序只要求跑在Solaris上面,不會出現異構的平臺;最后ACE庫本身太繁雜了,很多地方比如網絡相關的函數我們是不會用的,不過如果現在我們正在使用的網絡庫也使用ACE的話,那么使用ACE簡直再好不過了。
#include "ace/OS.h"
#include 
"ace/Task.h"
#include  
"ace/Thread.h"
#include 
"ace/Synch.h"

class Worker;

class IManager
{
public:
    
virtual int return_to_work (Worker *worker) = 0;
};

class Worker : public ACE_Task<ACE_MT_SYNCH>
{
public:
    Worker (IManager 
*manager) : manager_(manager) { }

    
//線程啟動之后進入本函數
    virtual int svc (void)
    {
        thread_id_ 
= ACE_Thread::self();

        
//工作線程啟動之后只有收到MB_HANGUP類型的消息它才會退出
        while (1)
        {
            ACE_Message_Block 
*mb = 0;

            
//如果隊列中沒有數據,本線程將被阻塞
            if (this->getq(mb) == -1)
                ACE_ERROR_BREAK((LM_ERROR, ACE_TEXT (
"%p "), ACE_TEXT ("getq")));

            
// 如果是MB_HANGUP消息,就結束線程
            if (mb->msg_type() == ACE_Message_Block::MB_HANGUP)
            {
                ACE_DEBUG ((LM_INFO,
                    ACE_TEXT (
"(%t) Shutting down ")));
                    mb
->release();

                
break;
            }

            
// Process the message.
            process_message (mb);

            
// Return to work.
            
// 這里會將自己放到線程池中,并通過workers_cond_來通知manager
            this->manager_->return_to_work (this);
        }

        
return 0;
    }

    ACE_thread_t thread_id(
void)
    {
        
return thread_id_;
    }

private:

    
//處理消息
    void process_message (ACE_Message_Block *mb)
    {
        ACE_TRACE (ACE_TEXT (
"Worker::process_message"));

        
int msgId;

        ACE_OS::memcpy (
&msgId, mb->rd_ptr(), sizeof(int));

        mb
->release();

        ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT (
"(%t) Started processing message %d "),
            msgId));

        ACE_OS::sleep(
3);

        ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT (
"(%t) Finished processing message %d "),
            msgId));
    }

    
//指向線程池管理器
    IManager *manager_;

    
//保存本線程id號
    ACE_thread_t thread_id_;
};

class Manager : public ACE_Task<ACE_MT_SYNCH>public IManager
{
public:
    
enum {POOL_SIZE = 5, MAX_TIMEOUT = 5};

    Manager ()
        : shutdown_(
0), workers_lock_(), workers_cond_(workers_lock_)
    {
        ACE_TRACE (ACE_TEXT (
"Manager::Manager"));
    }

    
/* 線程處理函數 */
    
int svc (void)
    {
        ACE_TRACE (ACE_TEXT (
"Manager::svc"));

        ACE_DEBUG ((LM_INFO, ACE_TEXT (
"(%t) Manager started ")));

        
// Create pool.
        create_worker_pool();

        
while (true)
        {
            ACE_Message_Block 
*mb = 0;
            ACE_Time_Value tv ((
long)MAX_TIMEOUT);
            tv 
+= ACE_OS::time (0);

            
// Get a message request.
            if (this->getq (mb, &tv) < 0)
            {
                shut_down ();
                
break;
            }

            
// Choose a worker.
            Worker *worker = 0;

            
/* 
            這對大括號中的代碼從worker線程池中獲取一個工作線程,線程池由
            this->workers_lock_互斥體加以保護,如果沒有worker可用,manager
            會阻塞在workers_lock_條件變量上,等待某個線程回來工作
            
*/
            {
                ACE_GUARD_RETURN (ACE_Thread_Mutex,
                    worker_mon, 
this->workers_lock_, -1);

                
/* 
                阻塞在workers_lock_.wait()上直到有worker可用,當某個worker回來后
                會把自己放到線程池隊列上,同時通過觸發workers_cond_來通知manager
                
*/
                
while (this->workers_.is_empty ())
                    workers_cond_.wait ();

                
/* 將獲取的worker從線程池隊列中刪除 */
                
this->workers_.dequeue_head (worker);
            }

            
// Ask the worker to do the job.
            
// 將請求消息放入到worker的消息隊列中
            worker->putq (mb);
        }

        
return 0;
    }

    
int shut_down (void)
    {
         ACE_TRACE (ACE_TEXT (
"ACE_ThreadPool::DestroyPool"));

         ACE_Unbounded_Queue
<Worker* >::ITERATOR iter = this->workers_.begin();

        Worker
** worker_ptr = NULL;

         
do
        {
            iter.next (worker_ptr);

            Worker 
*worker = (*worker_ptr);

            
// Send the hangup message.
            ACE_Message_Block *mb;
            ACE_NEW_RETURN(
                mb,
                ACE_Message_Block(
0,
                ACE_Message_Block::MB_HANGUP),
                
-1);

            worker
->putq(mb);

            
// Wait for the exit.
            worker->wait();

            ACE_ASSERT (worker
->msg_queue()->is_empty ());

            delete worker;
         }
while (iter.advance());

         
return 0;
    };

    ACE_thread_t thread_id (Worker 
*worker);

    
/* 提供給worker的接口,用于在worker完成處理后,將自己放入到線程池隊列,并通知manager */
    
virtual int return_to_work (Worker *worker)
    {
        ACE_GUARD_RETURN (ACE_Thread_Mutex,
            worker_mon, 
this->workers_lock_, -1);

        ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT (
"(%t) Worker %u returning to work. "),
            worker
->thr_mgr()->thr_self()));

        
// 將worker放入到線程池隊列
        this->workers_.enqueue_tail (worker);

        
// 觸發條件變量,通知manager
        this->workers_cond_.signal ();

        
return 0;
    }

private:
// 創建worker線程池
    int create_worker_pool (void)
    {
        ACE_GUARD_RETURN (ACE_Thread_Mutex,
            worker_mon,
            
this->workers_lock_,
            
-1);

        
for (int i = 0; i < POOL_SIZE; i++)
        {
            Worker 
*worker;

            
// 創建worker
            ACE_NEW_RETURN (worker, Worker (this), -1);

            
// 放入線程池隊列
            this->workers_.enqueue_tail (worker);

            
// 激活線程,調用該函數后,worker線程被創建,由于worker
            
// 是ACE_Task的子類,線程激活后,從svc函數開始執行
            worker->activate ();
        }

        
return 0;
    }

private:
    
int shutdown_;

    
/* workers_lock_ 線程池隊列的互斥體,在對線程池進行操作時,需要通過互斥鎖來保護
    所以在所有的線程池隊列隊列操作前都有這樣的語句:
        ACE_GUARD_RETURN (ACE_Thread_Mutex,
        worker_mon, this->workers_lock_, -1);
        
*/
    ACE_Thread_Mutex workers_lock_;
    ACE_Condition
<ACE_Thread_Mutex> workers_cond_;

    
/* 線程池隊列 */
    ACE_Unbounded_Queue
<Worker* > workers_;
};

int ACE_TMAIN (int, ACE_TCHAR *[])
{
    Manager tp;
    tp.activate ();

    
// Wait for a moment every time you send a message.
    ACE_Time_Value tv;
    tv.msec (
100);

    ACE_Message_Block 
*mb;
    
for (int i = 0; i < 10; i++)
    {
        ACE_NEW_RETURN(mb, ACE_Message_Block(
sizeof(int)), -1);

        ACE_OS::memcpy (mb
->wr_ptr(), &i, sizeof(int));

        ACE_OS::sleep(tv);

        
// Add a new work item.
        
// 這里將請求消息首先發到了manager線程,由manager線程負責分發
        tp.putq (mb);
    }

    
// 主線程等待子線程結束
    ACE_Thread_Manager::instance()->wait();

    
return 0;
}


posted on 2009-11-02 18:13 老馬驛站 閱讀(2244) 評論(0)  編輯 收藏 引用 所屬分類: ACE
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩岛国| 久久久久久久高潮| 国产精品私拍pans大尺度在线| 欧美18av| 欧美日韩在线不卡| 国产精品美女www爽爽爽| 国产精品久久久久毛片大屁完整版| 欧美日韩一区在线观看视频| 欧美午夜精品久久久久久人妖| 国产精品人成在线观看免费| 国产一区二区视频在线观看| 亚洲电影中文字幕| 在线一区二区三区做爰视频网站| 亚洲欧美高清| 美女尤物久久精品| 亚洲麻豆一区| 欧美在线播放一区| 欧美巨乳在线观看| 国产目拍亚洲精品99久久精品| 极品少妇一区二区三区精品视频| 亚洲精品少妇30p| 性色av一区二区三区红粉影视| 麻豆精品视频在线观看| 亚洲精品一二三| 羞羞漫画18久久大片| 欧美精品亚洲一区二区在线播放| 国产精品日韩一区二区| 亚洲三级毛片| 久久成人精品| 一本一本久久a久久精品综合麻豆| 久久国产精品久久国产精品| 欧美性视频网站| 亚洲人成绝费网站色www| 欧美一区激情| 亚洲精品国精品久久99热| 亚洲一区二区在线看| 欧美激情无毛| 亚洲大胆人体视频| 久久成人免费电影| 老司机午夜免费精品视频| 一区二区三区日韩欧美精品| 91久久精品国产91性色tv| 欧美成人国产| 久久国产福利国产秒拍| 蜜桃视频一区| 国产精品都在这里| 亚洲国产精品一区二区三区 | 免费看亚洲片| 国产视频精品免费播放| 亚洲综合精品| 一本综合精品| 欧美日韩国产综合新一区| 亚洲激情网站| 亚洲福利视频网站| 六月天综合网| 亚洲国产小视频在线观看| 老司机一区二区| 久久久之久亚州精品露出| 精品91久久久久| 免费av成人在线| 另类人畜视频在线| 亚洲人成欧美中文字幕| 亚洲国产高清一区| 欧美精品18+| 亚洲天堂男人| 亚洲女爱视频在线| 国产亚洲欧洲997久久综合| 久久久福利视频| 久久嫩草精品久久久精品| 亚洲国产欧美日韩另类综合| 亚洲国产99精品国自产| 欧美日韩高清在线播放| 中文在线不卡| 性欧美18~19sex高清播放| 国产主播在线一区| 亚洲第一二三四五区| 欧美久久一级| 欧美一区二区福利在线| 久久精品一区二区三区中文字幕| 亚洲国产精品一区二区第四页av | 久久精品亚洲热| 久久国产欧美日韩精品| 亚洲第一综合天堂另类专| 最新高清无码专区| 国产精品久久久久久久久免费 | 欧美高清在线视频| 麻豆亚洲精品| 一个色综合av| 欧美呦呦网站| 夜夜嗨一区二区| 亚洲欧美视频在线| 影音先锋另类| 一本色道综合亚洲| 影音先锋成人资源站| 日韩一区二区精品| 韩国欧美国产1区| 亚洲国产日韩欧美在线图片| 国产精品亚洲人在线观看| 久热精品视频在线免费观看| 欧美日韩精品高清| 久久这里只有| 欧美午夜精品一区| 欧美r片在线| 国产酒店精品激情| 亚洲精品久久久久久久久久久| 国产精品亚洲片夜色在线| 欧美大胆成人| 国产一区二区高清视频| 99精品国产高清一区二区| 亚洲大胆av| 欧美在线免费观看亚洲| 亚洲一区网站| 欧美另类一区| 欧美国产日韩一区二区在线观看 | 亚洲色图在线视频| 亚洲国产日韩欧美在线图片| 午夜精品美女久久久久av福利| 亚洲精品乱码久久久久久日本蜜臀 | 你懂的国产精品| 欧美在线观看网站| 欧美日韩一区在线观看| 亚洲人www| 91久久精品美女| 久久久福利视频| 久久一综合视频| 国产综合视频| 欧美一级二级三级蜜桃| 性欧美1819性猛交| 国产精品视频成人| 亚洲影视在线| 亚洲免费一区二区| 国产精品www.| 国产精品99久久99久久久二8| 9色国产精品| 欧美激情无毛| 日韩视频在线播放| 在线亚洲观看| 国产精品高潮视频| 一区二区三区高清不卡| 亚洲在线一区二区三区| 国产精品福利在线| 午夜精品久久久久久久99水蜜桃| 欧美一区午夜精品| 国产一区二区高清| 亚洲国产经典视频| 久久亚洲不卡| 国产视频在线观看一区二区| 欧美一级播放| 久久综合国产精品台湾中文娱乐网| 国产婷婷一区二区| 久久人91精品久久久久久不卡| 免费观看亚洲视频大全| 亚洲欧洲综合| 欧美色另类天堂2015| 亚洲欧美中文字幕| 久久天天躁狠狠躁夜夜av| 尤物九九久久国产精品的特点| 欧美sm视频| 日韩一级黄色大片| 久久久免费av| 亚洲日本精品国产第一区| 欧美精品在线一区二区| 亚洲欧美激情四射在线日| 噜噜爱69成人精品| 一本色道久久综合精品竹菊| 亚洲国产精品毛片| 蜜桃精品久久久久久久免费影院| 亚洲深夜福利网站| 国产精品va在线播放| 久久精品99国产精品| 欧美激情一区二区三级高清视频 | 欧美α欧美αv大片| 一区二区三区四区蜜桃| 久久免费视频在线| 一个色综合av| 一区二区在线观看视频在线观看 | 欧美日韩免费网站| 欧美在线网址| 亚洲三级毛片| 久久久999成人| aa国产精品| 在线观看欧美黄色| 国产精品久久久久aaaa樱花| 久久一综合视频| 亚洲一二三区视频在线观看| 亚洲第一福利在线观看| 国产精品美女www爽爽爽| 久久一区激情| 香蕉亚洲视频| 在线亚洲精品| 亚洲激情视频| 你懂的网址国产 欧美| 午夜激情久久久| 洋洋av久久久久久久一区| 激情久久综合| 国产欧美精品日韩精品| 欧美午夜性色大片在线观看| 欧美国产日韩一区二区在线观看| 久久成年人视频| 欧美一区二区|