ACE_Thread_Manager(v3.12)

介绍

这个类提供了线程管理的功能,并提供一个全局单例来管理当前进程创建的所有线程。一个进程通常是一个EXE。,线程可在进程中调用ACE_Thread_Manager的成员方法来退出。
有一种线程创建和结束的方式例外,那就是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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值