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

隨筆-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>
            一区二区三区成人精品| 亚洲激情不卡| 欧美成人激情视频免费观看| 亚洲免费伊人电影在线观看av| 亚洲视频电影图片偷拍一区| 亚洲视频一区二区| 欧美诱惑福利视频| 久久久久久穴| 欧美伦理视频网站| 国产伦精品一区二区三区照片91 | 久久激情五月婷婷| 久久色在线观看| 欧美视频一区二区| 国产亚洲激情在线| 日韩视频在线免费| 久久激情网站| 亚洲欧洲另类国产综合| 亚洲作爱视频| 久久久欧美一区二区| 欧美日韩亚洲国产精品| 国产日韩欧美a| 亚洲美女视频在线免费观看| 欧美专区在线| 99re6这里只有精品视频在线观看| 亚洲欧美卡通另类91av | 欧美a级片一区| 国产精品久久久久国产精品日日 | 国产精品国产| 亚洲国产一区二区a毛片| 欧美日韩喷水| 国产又爽又黄的激情精品视频| 99pao成人国产永久免费视频| 亚洲欧美大片| 亚洲日韩欧美视频一区| 欧美在线网站| 国产精品一区在线观看| 99re这里只有精品6| 蜜桃视频一区| 新狼窝色av性久久久久久| 欧美日韩亚洲成人| 99国产精品99久久久久久| 老司机免费视频久久| 香蕉成人伊视频在线观看 | 亚洲精品小视频在线观看| 欧美一区成人| 一本大道久久a久久精二百| 欧美.日韩.国产.一区.二区| 韩国av一区二区三区在线观看| 亚洲欧美中文日韩v在线观看| 99精品国产99久久久久久福利| 欧美大色视频| 亚洲国产日韩欧美| 免费不卡在线观看av| 欧美一区二区三区久久精品茉莉花 | 1024亚洲| 欧美国产激情| 免费久久99精品国产自| 亚洲国产经典视频| 久久综合久色欧美综合狠狠 | 亚洲女女女同性video| 日韩视频在线观看| 欧美日韩一区二区三区在线视频 | 亚洲欧美中文日韩v在线观看| 亚洲欧洲一区二区三区在线观看| 欧美不卡视频一区| 亚洲风情在线资源站| 亚洲成人在线免费| 欧美精品一区二区三区在线看午夜 | 亚洲伊人伊色伊影伊综合网| aa级大片欧美三级| 国产精品久久久久久久久久尿| 国产九九精品视频| 亚洲欧美日韩在线不卡| 一区二区三区欧美在线| 国产精品区一区二区三| 久久av一区二区| 久久午夜激情| 一卡二卡3卡四卡高清精品视频| 99riav1国产精品视频| 国产精品久久久一本精品| 欧美在线影院| 免费日本视频一区| 午夜激情综合网| 久久久亚洲欧洲日产国码αv| 亚洲精品资源美女情侣酒店| 正在播放亚洲一区| 一区久久精品| 日韩视频不卡中文| 激情视频一区二区| 亚洲精品欧美极品| 国产一区二区久久久| 亚洲黄网站黄| 国产色产综合色产在线视频| 亚洲第一二三四五区| 国产精品色婷婷久久58| 欧美国产日本韩| 国产农村妇女精品一二区| 欧美大秀在线观看| 国产无一区二区| 一本久道久久综合婷婷鲸鱼| 狠狠色狠狠色综合人人| 亚洲美女精品成人在线视频| 国产在线精品成人一区二区三区| 亚洲精品久久久久久久久久久| 国内精品久久久久久久果冻传媒| 亚洲第一页自拍| 国产一区二区三区不卡在线观看| 亚洲精品日韩久久| 亚洲国产你懂的| 欧美一区二区三区久久精品茉莉花| 亚洲视频一区二区| 免费精品99久久国产综合精品| 久久aⅴ国产欧美74aaa| 欧美午夜理伦三级在线观看| 蜜桃精品一区二区三区| 国产日韩欧美电影在线观看| 一二三区精品| 亚洲私人影院| 欧美国产免费| 亚洲电影在线观看| 亚洲国产精品久久91精品| 亚洲一区二区三区免费观看| 日韩一区二区精品视频| 欧美电影免费观看高清完整版| 麻豆精品精华液| 精品电影在线观看| 久久久99国产精品免费| 久久久综合精品| 国产亚洲欧洲一区高清在线观看 | 亚洲欧美国产另类| 欧美日韩91| 亚洲免费成人| 亚洲午夜高清视频| 欧美午夜a级限制福利片| 亚洲欧洲99久久| 欧美日韩色综合| 亚洲麻豆av| 一区二区精品| 欧美视频一区二区在线观看| 日韩视频一区二区三区在线播放免费观看 | 久久久综合激的五月天| 久久久久久久999| 好看的av在线不卡观看| 久久精品人人做人人爽| 免费欧美电影| 日韩亚洲精品在线| 国产精品高潮视频| 午夜精品一区二区在线观看| 性做久久久久久久久| 国产综合香蕉五月婷在线| 久久亚洲国产成人| 亚洲国产日韩欧美在线99| 一区二区高清在线观看| 国产精品久久久久9999| 午夜精品久久久久久久白皮肤| 久久精品视频免费观看| 亚洲国产精品高清久久久| 欧美日韩免费看| 欧美中文字幕不卡| 亚洲人精品午夜在线观看| 亚洲女同在线| 亚洲电影视频在线| 欧美日韩亚洲国产精品| 久久国产综合精品| 亚洲精选成人| 久久嫩草精品久久久精品一| 亚洲精品一区二区三区四区高清| 国产精品美女久久| 嫩模写真一区二区三区三州| 亚洲伊人网站| 亚洲日韩中文字幕在线播放| 欧美在线关看| 一区二区三区四区五区视频| 国内精品久久久久伊人av| 欧美极品影院| 久久激情久久| 亚洲深夜福利视频| 免费高清在线视频一区·| 亚洲网友自拍| 伊人狠狠色j香婷婷综合| 欧美日韩国产一区二区三区| 久久久综合网站| 亚洲欧美影院| 99精品国产一区二区青青牛奶| 美女精品网站| 久久精品国产精品亚洲综合 | 亚洲一区二区免费在线| 亚洲国产美女久久久久| 国产在线视频不卡二| 欧美日韩亚洲高清| 欧美h视频在线| 久久久之久亚州精品露出| 亚洲综合电影| 夜夜嗨av一区二区三区网站四季av | 欧美呦呦网站| 99精品视频免费观看| 蜜桃av一区| 欧美在线视频免费| 在线亚洲欧美视频| 亚洲精品专区|