使用 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
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?