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

隨筆-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>
            欧美亚洲在线观看| 亚洲一本大道在线| 欧美大片在线观看一区| 亚洲欧美经典视频| 一区二区欧美日韩| 亚洲天堂免费观看| 欧美一区二区观看视频| 久久狠狠久久综合桃花| 久久夜色精品国产亚洲aⅴ| 久久婷婷久久| 亚洲第一天堂无码专区| 久久精品国产精品| 久久在线观看视频| 亚洲高清不卡| 亚洲高清二区| 一本色道久久综合亚洲91| 一区二区欧美日韩| 性欧美video另类hd性玩具| 久久久精品欧美丰满| 玖玖玖国产精品| 免费成人毛片| 午夜亚洲性色视频| 亚洲伦理在线观看| 在线观看成人一级片| 亚洲精品一区中文| 亚洲欧美日韩国产中文| 欧美刺激午夜性久久久久久久| 日韩视频一区二区三区| 欧美一区亚洲一区| 欧美视频四区| 亚洲国产精品999| 欧美午夜影院| 黑人一区二区| 亚洲乱码国产乱码精品精可以看| 亚洲午夜精品一区二区| 久久久久久色| 亚洲一区二区视频| 美女亚洲精品| 国产日韩欧美亚洲一区| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲欧洲日产国码二区| 亚洲日本理论电影| 亚洲欧美一区二区激情| 欧美成人免费全部观看天天性色| 国产精品入口日韩视频大尺度| 一区在线视频| 欧美亚洲一区二区三区| 亚洲日韩中文字幕在线播放| 午夜在线不卡| 国产精品久久久久免费a∨| 精品1区2区3区4区| 欧美在线免费视屏| 中日韩男男gay无套| 欧美承认网站| 亚洲国产日韩一区二区| 久久综合999| 欧美一区91| 国产精品护士白丝一区av| 亚洲激情电影在线| 美女91精品| 久久精品视频亚洲| 亚洲在线第一页| 国产精品videossex久久发布| 亚洲黄色av一区| 欧美va亚洲va香蕉在线| 久久久久久久久久久久久女国产乱 | 亚洲乱码精品一二三四区日韩在线 | 亚洲欧美日韩精品久久亚洲区 | 亚洲丶国产丶欧美一区二区三区 | 久久精品一区二区| 亚洲人成小说网站色在线| 猫咪成人在线观看| 久久久久.com| 在线电影国产精品| 亚洲承认在线| 欧美日韩ab片| 国产精品成人观看视频免费| 在线一区二区三区做爰视频网站| 夜夜嗨av一区二区三区四区| 欧美日韩精品综合在线| 这里只有精品视频| 99pao成人国产永久免费视频| 国产精品第一区| 久久久爽爽爽美女图片| 麻豆精品传媒视频| 亚洲一区二区三区免费观看 | 国产一区二区精品久久| 久久久www成人免费无遮挡大片 | 欧美/亚洲一区| 亚洲深夜福利网站| 亚洲调教视频在线观看| 国产午夜精品一区二区三区视频 | 欧美专区在线播放| 久热re这里精品视频在线6| 亚洲精品免费在线| 99综合在线| 国内成人精品一区| 亚洲欧洲日韩在线| 国产精品久久久一本精品| 久久久久.com| 欧美日韩一区二区高清| 久久久99爱| 欧美全黄视频| 免费成人高清视频| 国产精品一区二区三区乱码| 欧美国产精品劲爆| 国产精品影片在线观看| 亚洲精品国产欧美| 在线观看三级视频欧美| 亚洲欧美国产va在线影院| 99国产精品久久久| 久久这里有精品15一区二区三区| 午夜精品一区二区在线观看| 欧美精品二区| 欧美福利视频在线| 黑人一区二区三区四区五区| 亚洲一二三级电影| 一区二区欧美在线观看| 免费成人黄色片| 免费日韩一区二区| 国产日韩欧美日韩| 亚洲国产经典视频| 亚洲激情社区| 伊人成人网在线看| 男人的天堂亚洲| 欧美日韩人人澡狠狠躁视频| 久久se精品一区二区| 美日韩在线观看| 欧美专区在线观看| 欧美视频中文字幕| 亚洲区免费影片| 精品动漫3d一区二区三区免费| 在线亚洲精品| 在线亚洲一区| 欧美日韩中文字幕日韩欧美| 亚洲国产老妈| 亚洲激情成人在线| 久久精品91| 久久久一二三| 国产一区二区三区在线观看免费视频| 亚洲美女av网站| 日韩视频一区二区三区| 欧美高清成人| 亚洲精品一区二区三区樱花| 99亚洲视频| 国产精品xxx在线观看www| 日韩亚洲视频| 欧美一区日韩一区| 国产婷婷色一区二区三区四区| 午夜精品久久一牛影视| 久久电影一区| 精品成人久久| 女主播福利一区| 亚洲日本一区二区三区| 亚洲图片在线观看| 国产乱码精品1区2区3区| 午夜精品久久久99热福利| 久久精品99国产精品酒店日本| 国产一区二区三区不卡在线观看| 欧美一区二区网站| 久久综合五月| 亚洲欧洲一区二区三区在线观看 | 久久永久免费| 亚洲国产高清在线观看视频| 一区二区精品在线| 国产精品男人爽免费视频1| 午夜一区二区三视频在线观看 | 亚洲乱码日产精品bd| 欧美日韩午夜激情| 午夜精品亚洲一区二区三区嫩草| 久久久久综合| 亚洲午夜精品17c| 国产在线视频欧美| 欧美成人精品一区| 午夜综合激情| 亚洲精品一二三| 欧美专区福利在线| 日韩视频免费在线| 国产亚洲欧美一区| 欧美理论在线| 性久久久久久久久久久久| 欧美高清在线播放| 亚洲免费视频在线观看| 欧美在线视频二区| 亚洲黑丝一区二区| 久久久美女艺术照精彩视频福利播放| 亚洲片国产一区一级在线观看| 国产精品毛片| 欧美成在线视频| 久久久久久久综合狠狠综合| 一本色道久久综合狠狠躁篇怎么玩 | 欧美一区二区三区视频在线| 亚洲全部视频| 蜜桃av久久久亚洲精品| 亚洲网址在线| 亚洲国产精品ⅴa在线观看| 国产视频亚洲| 国产精品美女久久| 欧美日韩蜜桃| 欧美精品福利在线|