栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

利用ace的ACE_Task等类实现线程池的方法详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用ace的ACE_Task等类实现线程池的方法详解

本代码应该是ace自带的例子了,但是我觉得是非常好的,于是给大家分享一下。
注释非常详细啊。
头文件
复制代码 代码如下:
#ifndef THREAD_POOL_H
#define THREAD_POOL_H

#include "ace/Task.h"
//add by ychen 20070714 below
#include "ace/Mutex.h"
//add by ychen 20070714 above
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif


class ACE_Event_Handler;

class Thread_Pool : public ACE_Task
{
public:
  typedef ACE_Task inherited;
 
  enum size_t
  {
    default_pool_size_ = 1
  };
  // Basic constructor
  Thread_Pool (void);
 
  int open (int pool_size = default_pool_size_);
 
  virtual int open (void *void_data)
  {
    return inherited::open (void_data);
  }
 
  virtual int close (u_long flags = 0);
 
  int enqueue (ACE_Event_Handler *handler);
 
    typedef ACE_Atomic_Op counter_t;

protected:
 
  int svc (void);
 
  counter_t active_threads_;
};
#endif

实现文件
复制代码 代码如下:
// thread_pool.cpp,v 1.9 1999/09/22 03:13:42 jcej Exp
#include "thread_pool.h"

#include "ace/Event_Handler.h"

Thread_Pool::Thread_Pool (void)
  : active_threads_ (0)
{
}

int
Thread_Pool::open (int pool_size)
{
  return this->activate (THR_NEW_LWP|THR_DETACHED, pool_size);
}

int
Thread_Pool::close (u_long flags)
{
  ACE_UNUSED_ARG(flags);
 
  int counter = active_threads_.value ();
 
  while (counter--)
    this->enqueue (0);
 
  while (active_threads_.value ())
    ACE_OS::sleep (ACE_Time_Value (0, 250000));
  return(0);
}

int
Thread_Pool::enqueue (ACE_Event_Handler *handler)
{
 
 
  void *v_data = (void *) handler;
  char *c_data = (char *) v_data;
  ACE_Message_Block *mb;
 
  ACE_NEW_RETURN (mb,
                  ACE_Message_Block (c_data),
                  -1);
 
  if (this->putq (mb) == -1)
    {
     
      mb->release ();
      return -1;
    }
  return 0;
}


class Counter_Guard
{
public:
  Counter_Guard (Thread_Pool::counter_t &counter)
    : counter_ (counter)
  {
    ++counter_;
  }
  ~Counter_Guard (void)
  {
    --counter_;
  }
protected:
  Thread_Pool::counter_t &counter_;
};

class Message_Block_Guard
{
public:
  Message_Block_Guard (ACE_Message_Block *&mb)
    : mb_ (mb)
  {
  }
  ~Message_Block_Guard (void)
  {
    mb_->release ();
  }
protected:
  ACE_Message_Block *&mb_;
};

int
Thread_Pool::svc (void)
{
 
  ACE_Message_Block *mb;
 
  Counter_Guard counter_guard (active_threads_);
 
  while (this->getq (mb) != -1)
    {
     
      Message_Block_Guard message_block_guard (mb);
     
      char *c_data = mb->base ();
     
      if (c_data)
        {
         
          void *v_data = (void *) c_data;
          ACE_Event_Handler *handler = (ACE_Event_Handler *) v_data;
         
          if (handler->handle_input (ACE_INVALID_HANDLE) == -1)
            {
             
              handler->handle_close (handler->get_handle (), 0);
             
            }
        }
      else
       
          return 0;  // Ok, shutdown request
      // message_block_guard goes out of scope here and releases the
      // message_block instance.
    }
  return 0;
}

其中,对其中类中的两个变量使用了管理的思想。Counter_Guard类和Message_Block_Guard 类分别对其进行了管理。
因为ACE_Task类是使用了ACE_message_block 进行对消息的封装。因此使用类,防止了内存的泄漏。
ACE_Event_Handler  是事件句柄,类似于操作符。当我们处理的时候,对其进行处理。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/66467.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号