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

隨筆-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 老馬驛站 閱讀(2256) 評論(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>
            国产精品久久国产三级国电话系列| 欧美黄色免费网站| 国产精品一区二区黑丝| 亚洲午夜在线| 亚洲免费一在线| 韩日在线一区| 欧美成人性网| 欧美日韩在线电影| 欧美一区二区三区婷婷月色| 性欧美长视频| 一区精品在线| 亚洲精品视频在线| 国产欧美日韩一区| 六十路精品视频| 欧美www视频| 亚洲一区二区三区三| 欧美一区二区播放| 亚洲国内欧美| 亚洲自拍都市欧美小说| 亚洲大胆人体视频| 一本色道久久综合狠狠躁篇怎么玩| 国产精品久久久久一区二区三区| 久久激情五月激情| 欧美大胆成人| 久久久久久久一区二区| 免费精品视频| 欧美一区亚洲二区| 欧美肥婆bbw| 久久婷婷人人澡人人喊人人爽| 男女激情久久| 久久久久久婷| 国产精品成人观看视频免费| 另类av导航| 国产精品久久久久91| 欧美成人精品| 国产欧美精品日韩精品| 亚洲精品女人| 国产三区精品| 99在线精品观看| 亚洲日韩欧美视频一区| 亚洲欧美日本日韩| 在线亚洲伦理| 欧美电影美腿模特1979在线看| 久久国产88| 国产精品国产三级国产普通话三级| 免费永久网站黄欧美| 国产精品一香蕉国产线看观看| 亚洲精品欧美精品| 亚洲日本成人女熟在线观看| 久久国产精品高清| 欧美在线视频免费播放| 国产精品啊啊啊| 日韩一区二区精品在线观看| 亚洲欧洲日产国产网站| 久久久亚洲精品一区二区三区| 久久激情视频| 国产日韩1区| 亚洲欧美在线磁力| 性欧美xxxx大乳国产app| 欧美性猛交xxxx免费看久久久| 最新日韩在线| 日韩亚洲不卡在线| 欧美连裤袜在线视频| 亚洲国产精品久久久久久女王| 亚洲黄网站黄| 免费成人av资源网| 欧美激情亚洲| 一本色道久久| 欧美三级乱码| 亚洲淫性视频| 久久精品国产精品亚洲精品| 国产精品久久久久秋霞鲁丝| 亚洲婷婷综合久久一本伊一区| 亚洲欧美日韩在线观看a三区| 欧美午夜在线一二页| 一区二区高清在线| 欧美一级久久久| 国产午夜精品麻豆| 久久夜色精品国产欧美乱极品| 牛牛国产精品| 99re6这里只有精品视频在线观看| 欧美经典一区二区三区| 日韩一区二区精品葵司在线| 亚洲欧美日韩精品综合在线观看| 国产精品视频久久一区| 亚洲一区二区在线| 久久国产精品黑丝| 伊人精品久久久久7777| 欧美精品电影| 篠田优中文在线播放第一区| 免费久久99精品国产自在现线| 亚洲精品少妇| 国产精品乱码久久久久久| 欧美伊人久久大香线蕉综合69| 浪潮色综合久久天堂| 99精品视频一区| 国产一级精品aaaaa看| 欧美**人妖| 亚洲欧美日韩精品| 欧美激情成人在线视频| 亚洲尤物精选| 在线观看日韩av| 国产精品国产馆在线真实露脸| 欧美制服丝袜| 99精品国产福利在线观看免费| 久久av红桃一区二区小说| 亚洲国产三级网| 国产精品自在欧美一区| 美女被久久久| 亚洲欧美日本日韩| 亚洲精品美女久久7777777| 久久成人免费电影| 一区二区三区四区在线| 国产一二三精品| 国产精品国产| 欧美激情亚洲综合一区| 欧美在线观看网址综合| 一本不卡影院| 亚洲国产另类精品专区| 久久久精品国产99久久精品芒果| 中文无字幕一区二区三区| 好看的av在线不卡观看| 国产精品爱久久久久久久| 欧美成人四级电影| 久久精品女人的天堂av| 性欧美精品高清| 一区二区三区四区国产| 亚洲欧洲一区二区三区在线观看| 久久久久成人精品| 欧美有码在线视频| 亚洲摸下面视频| 亚洲一区二区三区在线播放| 亚洲精品欧美激情| 亚洲精美视频| 亚洲国产欧美不卡在线观看| 国产一区二区成人久久免费影院| 欧美网站在线| 欧美日韩精品不卡| 欧美黑人多人双交| 久久亚洲视频| 玖玖视频精品| 免费看的黄色欧美网站| 久久综合伊人| 欧美高清视频一区二区三区在线观看| 久久黄金**| 久久久人成影片一区二区三区| 午夜精品在线| 欧美在线播放| 久久影视精品| 久久一区免费| 欧美久久久久久久久久| 欧美日韩国产三级| 欧美视频精品在线| 国产精品天天看| 好看不卡的中文字幕| 永久免费视频成人| 亚洲精品极品| 亚洲一区中文字幕在线观看| 亚洲一区二区毛片| 欧美综合77777色婷婷| 久久在线免费视频| 亚洲电影免费观看高清完整版在线观看 | 亚洲日本成人网| 9色porny自拍视频一区二区| 亚洲视频免费在线| 久久av红桃一区二区小说| 久久综合久色欧美综合狠狠| 欧美二区在线观看| 亚洲人www| 亚洲嫩草精品久久| 久久综合激情| 欧美日韩在线不卡一区| 国产欧美日韩一区二区三区| 精品不卡一区| 在线视频免费在线观看一区二区| 亚洲视频第一页| 久久九九国产精品| 亚洲人成绝费网站色www| 亚洲一区二区三区高清| 久久精品亚洲精品| 欧美激情在线| 国产一区二区三区在线免费观看 | 免费日本视频一区| 国产精品v亚洲精品v日韩精品 | 亚洲自拍高清| 另类亚洲自拍| 亚洲图片在线观看| 久久久亚洲综合| 国产精品v日韩精品v欧美精品网站| 国产亚洲欧美日韩日本| 91久久精品国产91久久性色| 欧美一区二区三区免费在线看| 欧美福利一区二区| 午夜久久一区| 欧美日韩视频在线一区二区| 国产一区二区三区自拍 | 亚洲第一中文字幕| 午夜精品久久99蜜桃的功能介绍| 欧美aaa级| 久久精品理论片|