-
proactor windows下的线程模型问题 - [ACE]
2008-01-09
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://egeho123.blogbus.com/logs/13564359.html
rosebush 新手上路
UID 32
精华 0
积分 0
帖子 12
阅读权限 10
注册 2007-12-13
状态 离线我将echoserver的代码贴出供大家研究测试2 多线程的proactor部分CODE:proactorTask.h
#ifndef _CPROACTOR_TASK_H_
#define _CPROACTOR_TASK_H_
#pragma once
#include "ace\Task_T.h"
#include "ace\Thread_Semaphore.h"
#include "ace\Proactor.h"
#include "ace\WIN32_Proactor.h"
class CProactorTask :public ACE_Task<ACE_MT_SYNCH>
{
public:
CProactorTask(void);
virtual ~CProactorTask(void);
int Start(const int nMax);
int Stop(void);
int Create(void);
int Release(void);
virtual int svc(void);
protected:
ACE_Thread_Semaphore m_sem; //信号量
ACE_Proactor* m_pProactor; //完成端口对象指针
};
#endif
---------------------------------------------------------------------------------------------------
cpp部分
#include "StdAfx.h"
#include "ProactorTask.h"
CProactorTask::CProactorTask(void)
{
}
CProactorTask::~CProactorTask(void)
{
}
//
//创建完成端口对象
//
int CProactorTask::Create(void)
{
ACE_WIN32_Proactor *proactor_impl = 0;
//新建
ACE_NEW_RETURN(proactor_impl, ACE_WIN32_Proactor, -1);
//关联
ACE_NEW_RETURN(this->m_pProactor, ACE_Proactor(proactor_impl, 1 ), -1);
//保存
ACE_Proactor::instance(this->m_pProactor, 1);
return 0;
}
//
//启动线程池
//
int CProactorTask::Start(const int nMax) //线程数量
{
//创建完成端口对象
Create();
//创建线程
this->activate(THR_NEW_LWP, nMax);
int i;
//保证所有线程已启动
for(i = nMax; i>0; i--)
{
m_sem.acquire(); //Block the thread until the semaphore count becomes greater than 0, then decrement it.
}
cout<<"Start."<<endl;
return 0;
}
//
//删除线程池
//
int CProactorTask::Stop(void)
{
ACE_Proactor::end_event_loop();
this->wait();
return 0;
}
//
//每个线程调用
//
int CProactorTask::svc(void)
{
ACE_DEBUG((LM_INFO,ACE_TEXT("svc函数调用!\n")));
//Increment the semaphore by 1
m_sem.release(1);
ACE_Proactor::run_event_loop();
return 0;
}
//
//释放
//
int CProactorTask::Release(void)
{
ACE_Proactor::close_singleton();
m_pProactor = 0;
cout<<"Release."<<endl;
return 0;
}
--------------------------------------------------------------------------------------------------------
main.cpp部分
// EchoServer.cpp : Defines the entry point for the console application.
//
// 2007.12.6
// Echo Server Proactor模式
#include "Winbase.h"
#include "stdafx.h"
#include "ace/INET_Addr.h"
#include "ace/Asynch_Acceptor.h"
#include "ServerHander.h"
#include "ProactorTask.h"
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"******* Echo Server *******"<<endl<<endl;
//获得CPU数量
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
int threadNum = sysInfo.dwNumberOfProcessors<<1; // CPU * 2
//开启线程
CProactorTask task;
task.Start( threadNum );
ACE_Asynch_Acceptor<ServerHander> MyAcceptor;
ACE_INET_Addr addr(5050);
if(MyAcceptor.open(addr) == -1)
{
cout<<"acceptor open failed..."<<endl;
return 1;
}
cout<<"Listening on "<< addr.get_port_number() <<"..."<<endl;
DWORD sleepTime = 0;
while(1)
{
cin>>sleepTime;
ServerHander::SetSleepTime(sleepTime);
cout<<"********** Set sleep time to "<<sleepTime<<" ************"<<endl;
}
return 0;
}历史上的今天:
软件版本标识含义 2008-01-09ACE中使用完成端口 2008-01-09SCTP-流控制传输协议-数据传输过程的技术研究 2008-01-09SCTP-流控制传输协议 2008-01-09最新SCTP协议 2008-01-09随机文章:
ACE Proactor框架使用实例 2008-04-02结合Reactor与Proactor框架 2008-04-02EPOLL使用例子 2008-03-26ACE中使用完成端口 2008-01-09Qt 中的多线程(一) 2007-12-05
收藏到:Del.icio.us









评论