介绍
这个类提供了线程管理的功能,并提供一个全局单例来管理当前进程创建的所有线程。一个进程通常是一个EXE。,线程可在进程中调用ACE_Thread_Manager的成员方法来退出。
有一种线程创建和结束的方式例外,那就是ACE_Task,ACE_Task的有自己的成员方法用于创建线程,有自己的方式结束线程,这里不做讨论。
ACE提供了一个全局单例供开发者调用,一般情况下只需要调用这个全局单例便可以了。
有一种线程创建和结束的方式例外,那就是ACE_Task,ACE_Task的有自己的成员方法用于创建线程,有自己的方式结束线程,这里不做讨论。
全局单例
ACE_Thread_Manager::instance()ACE提供了一个全局单例供开发者调用,一般情况下只需要调用这个全局单例便可以了。
使用的方式
包含头文件
在你的cpp文件中加上
#include "ace/Thread_Manager.h"
多线程程序有一个特点,因为机器一般都是线程并发,而不是并行执行,所以需要有一个单独的地方要等待所以进程结束之后才可以退出main;否则程序一开始就进入某个线程,这个线程一执行完整个exe程序就退出了,而其他线程还没来得及执行。
这个等待所有线程退出的方法就是:
ACE_Thread_Manager::instance()->wait();
这句代码通常也都写在main函数的返回语句之前,表示程序最后执行这句话。
退出当前的线程
当现在就想立即结束当前线程的执行,可以调用在当前线程函数内部调用全局线程管理方法退出当前线程
ACE_Thread_Manager::instance()->exit();
创建一个新线程(借助普通函数)
如果用函数创建线程,比如: ACE_Thread_Manager::instance()->spawn(
ACE_THR_FUNC(produce),
0,
THR_NEW_LWP | THR_DETACHED);
其中produce是一个函数:
void* produce(void*)
{
int out = 1000;
int in = 10;
for (int i= 0;i<out;++i)
{
Eledata_Msg* msg = new Eledata_Msg;
for (int j=0;j< in;j++)
{
//otl_datetime t(2014,4,24,2,4,4);
otl_datetime t(2014,10,31,2,4,4);
//msg->get_data().push_back(new e_eledata(j,t,t,2.2555,222.45,567.11,44,55,66,77,88,99,100,111,112,1000));
msg->get_data().push_back(new e_eledata(j,t,t,2.2555,222.45,567.11,44,55,400,100,100,100,100,111,112,1000));
}
insert_eledata_to_db(msg);
}
cout<<"insert finished!"<<endl;
ACE_Thread_Manager::instance()->exit();
return 0;
}
创建多个线程
这个函数可以被同时用来创建多个线程,比如: ACE_Thread_Manager::instance()->spawn(
ACE_THR_FUNC(produce),
0,
THR_NEW_LWP | THR_DETACHED);
ACE_Thread_Manager::instance()->spawn(
ACE_THR_FUNC(produce),
0,
THR_NEW_LWP | THR_DETACHED);
ACE_Thread_Manager::instance()->spawn(
ACE_THR_FUNC(produce),
0,
THR_NEW_LWP | THR_DETACHED);
如果每个线程做完自己的事情就要求退出,那最好在produce里写下线程退出的语句:
cout<<"insert finished!"<<endl;
ACE_Thread_Manager::instance()->exit();
这样程序执行的时候就会正常结束,而所有线程都结束的时候 ACE_Thread_Manager::instance()->wait();也就会结束了,从而main退出。
例如,输出如下:
sleep 5s begin
insert finished!
insert finished!
insert finished!
insert finished!
sleep 5s end
consumer exited
[root@localhost use_otl_test]#
程序结束执行
详细的面向对象的线程介绍参考:http://blog.csdn.net/calmreason/article/details/16922561