您当前的位置: 首页 >  unix

phymat.nico

暂无认证

  • 7浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用 ACE 库框架在 UNIX 中开发高性能并发应用

phymat.nico 发布时间:2017-12-20 21:49:35 ,浏览量:7

ACE 开放源码工具包可以帮助开发人员创建健壮的可移植多线程应用程序。本文讨论创建使用 ACE 线程的应用程序的一些方法。 Adaptive Communication Environment (ACE) 是一个高性能、开放源码、面向对象的框架和 C++ 类库,它有助于简化网络应用程序的开发。ACE 工具包包括一个操作系统层和一个封装网络 API 的 C++ 外观(facades)集合。本文讨论如何使用 ACE 线程设计高性能、并发、面向对象的网络应用程序。对 ACE 的完整说明,包括如何下载和安装这个工具包,请参见 参考资料。 用于创建和管理线程的 ACE 类 在进程中生成和管理多个线程涉及下面的类: ACE_Thread_Manager:这是负责创建、管理和同步线程的主要的类。每种操作系统在处理线程方面有细微差异,这个类对应用程序开发人员隐藏这些差异。 ACE_Sched_Params:使用这个类管理各个线程的调度优先级,调度优先级是在 ACE 源代码发行版的 ace/Sched_Params.h 头文件中定义的。可以采用不同的调度策略,可以是 “先到先服务” 的循环方式。 ACE_TSS:在多线程应用程序中使用全局变量会导致同步问题。ACE_TSS 类提供与线程相关的存储模式,可以对那些对于程序是全局的,但是对于每个线程私有的数据提供抽象。ACE_TSS 类提供 operator() 方法,这个方法提供与线程相关的数据。 了解线程管理器类 原生操作系统线程 API 是不可移植的:存在语法和语义差异。例如,UNIX? pthread_create() 和 Windows? CreateThread() 方法都创建线程,但是语法不一样。ACE_Thread_Manager 类提供以下功能: 它可以生成一个或更多线程,每个线程运行自己指定的函数。 它可以作为一个集合(称为 线程组)管理相关的线程。 它管理各个线程的调度优先级。 它允许在线程之间进行同步。 它可以修改线程属性,比如堆栈大小。 表 1. ACE_Thread_Manager 类的方法 方法名 说明 instance   ACE_Thread_Manager 类是一个单实例类,使用这个方法访问线程管理器的惟一实例。 spawn 这个方法创建一个新线程,它的一个输入参数是 C/C++ 函数指针,这个函数执行应用程序的特定工作。 exit         这个方法终止一个线程,释放这个线程的所有资源。 spawn_n 这个方法创建属于同一个线程组的多个线程。 close 这个方法关闭已经创建的所有线程并释放它们的资源。 suspend 线程管理器暂停指定的线程。 resume 线程管理器恢复执行前面暂停的线程。

使用 ACE_Thread_Manager 类的变体 可以作为单实例类使用 ACE_Thread_Manager 类,也可以创建这个类的多个实例。对于单一实例,通过调用 instance 方法访问实例。如果需要管理多个线程组,可以创建不同的线程管理器类,每个类控制它自己的线程集。 清单 1. 使用 ACE_Thread_Manager 类创建一个线程 #include "ace/Thread_Manager.h" #include void thread_start(void* arg) {   std::cout spawn((ACE_THR_FUNC)thread_start);   return 0; } 清单 2. ACE_Thread_Manager::spawn 方法的原型 int spawn (ACE_THR_FUNC func,              void *arg = 0,              long flags = THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED,              ACE_thread_t *t_id = 0,              ACE_hthread_t *t_handle = 0,              long priority = ACE_DEFAULT_THREAD_PRIORITY,              int grp_id = -1,              void *stack = 0,              size_t stack_size = ACE_DEFAULT_THREAD_STACKSIZE,              const char** thr_name = 0); 对于初学者来说,创建线程需要的参数数量似乎太多了,所以我们详细讨论一下各个参数和它们的作用:

ACE_THR_FUNC func:这是在生成线程时调用的函数。 void* arg:这是在生成线程时调用的函数的参数。void* 意味着用户可以传递应用程序特有的任何数据类型,甚至可以使用某种结构把多个参数组合成单一数据。 long flags:使用 flags 变量设置生成的线程的几个属性。各个属性都由单一位表示,按照 “或” 关系组合在一起。表 2 说明一些属性。 ACE_thread_t *t_id:使用这个函数访问创建的线程的 ID。每个线程具有惟一的 ID。 long priority:这是生成的线程的优先级。 int grp_id:如果提供这个参数,那么它表示生成的线程是否属于现有的某一线程组。如果传递 -1,那么创建新的线程组并在这个组中添加生成的线程。 void* stack:这是预先分配的堆栈区域的指针。如果提供 0,就请求操作系统提供生成的线程的堆栈区域。 size_t stack_size:这个参数指定线程堆栈的大小(字节数)。如果对于前一个参数(堆栈指针)指定了 0,那么请求操作系统提供大小为 stack_size 的堆栈区域。 const char** thr_name:这个参数只与支持线程命名的平台(比如 VxWorks)相关。对于 UNIX 平台,在大多数情况下忽略它。 线程创建标志 说明 THR_CANCEL_DISABLE 不允许取消这个线程。 THR_CANCEL_ENABLE 允许取消这个线程。 THR_DETACHED        创建异步线程。线程的退出状态对于其他任何线程不可用。当线程终止时,操作系统回收线程资源。 THR_JOINABLE        允许新线程的退出状态对于其他线程可用。这也是 ACE 创建的线程的默认属性。当这种线程终止时,操作系统不回收线程资源,直到其他线程联结它为止。 THR_NEW_LWP 创建显式的内核级线程(而不是用户级线程)。 THR_SUSPENDED 创建处于暂停状态的新线程。 清单 3. 使用 ACE_Thread_Manager 类创建多个线程  #include "ace/Thread_Manager.h" #include void print (void* args) {   int id = ACE_Thread_Manager::instance()->thr_self();   std::cout

关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0465s