ACE中实现线程池需要用到主动对象ACE_Task,而掌握ACE_Task的用法,需现了解ACE_Thread_Manager, ACE_Reactor, ACE_Message_Queue。
线程管理 ACE_Thread_Manager
1 特点: 屏蔽操作系统的差异,成员方法采用内联来减少调用开销;所有方法为static。
2 封装了线程的操作。创建spawn/spawn_n, 挂起suspend/suspend_grp, 取消cancel_all/cancel_task, 连接join, 杀死kill, 获取线程号thr_self等操作。
3 局限:spawn/spawn_n要求线程处理函数必须是静态的或全局的。
4 线程标志:THR_NEW_LWP|THR_JOINABLE
例子:
int n_threads= 10;
//number of threads to spawn
ACE_thread_t *threadID = new ACE_thread_t[n_threads+1];
ACE_thread_t *threadID = new ACE_thread_t[n_threads+1];
ACE_hthread_t *threadHandles = new ACE_hthread_t[n_threads+1];
if(ACE_Thread::spawn_n(threadID, //id’s for each of the threads
n_threads, //number of threads to spawn
(ACE_THR_FUNC)worker, //线程工作函数,必须是静态的或全局的
0, //args to worker
THR_JOINABLE | THR_NEW_LWP, //flags
ACE_DEFAULT_THREAD_PRIORITY,
0, 0, threadHandles)==-1)
{
ACE_DEBUG((LM_DEBUG,"Error in spawning thread\n"));
}
//等待所有线程结束
for(int i=0; i<n_threads; i++)
{
ACE_Thread::join(threadHandles[i]);
}
n_threads, //number of threads to spawn
(ACE_THR_FUNC)worker, //线程工作函数,必须是静态的或全局的
0, //args to worker
THR_JOINABLE | THR_NEW_LWP, //flags
ACE_DEFAULT_THREAD_PRIORITY,
0, 0, threadHandles)==-1)
{
ACE_DEBUG((LM_DEBUG,"Error in spawning thread\n"));
}
//等待所有线程结束
for(int i=0; i<n_threads; i++)
{
ACE_Thread::join(threadHandles[i]);
}