|
我在使用ACE5.5的时候,用到了其中的Proactor。
我的测试程序先创建了win32下的proactor后,在线程中启动了run_event_loop方法,然后在析构的时候调用了end_event_loop方法,可是每次在我调用end_event_loop方法的时候就要抛出一个异常,内容为:
"Unhandled exception in proact.exe(KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception"。
大家在使用ACE5.5的Proactor时有没有遇到过类似的问题呢?
下面是我的代码,只是简单的创建Proactor在删除它。
//异步反应器框架类-
- class SEA_Proactor : public ACE_Task<ACE_MT_SYNCH>
- {
- public :
- SEA_Proactor():
- sem_ ((unsigned int) 0),
- proactor_(0){}
- virtual ~SEA_Proactor()
- {
- (void) this->stop ();//停止异步方应器
- this->delete_proactor();//删除已创建的异步反应器
- }
- //启动异步反应器
- virtual int start(int iThreads)//启动线程的数目)
- {
- //创建一个异步反应器
- if(this->create_proactor() == -1)
- return -1;
- //启动异步方应器线程函数
- if(this->activate (THR_JOINABLE | THR_NEW_LWP,iThreads) == -1)
- return -1;
- //线程池中的每个线程等待获取线程锁
- for(;iThreads > 0;iThreads--)
- {
- if(sem_.acquire() == -1)
- return -1;
- }
- return 0;
- }
- //停止异步方应器
- virtual int stop(void)
- {
- //停止异步反应器内核运行
- if(this->proactor_ != 0)
- {
- ACE_Proactor::end_event_loop(); //执行到这一句就出错
- }
- //等待异步反应器线程函数结束
- if(this->wait () == -1)
- return -1;
- return 0;
- }
- //异步方应器线程函数
- virtual int svc(void)
- {
- //发出解锁信号表示线程函数已经开始运行
- sem_.release(1);
- //开始异步反应器内核运行
- ACE_Proactor::run_event_loop();
- return 0;
- }
- private:
- //创建一个异步反应器
- int create_proactor(void)
- {
- //定义一个32位windows操作系统下的异步反应器接口类的指针
- ACE_WIN32_Proactor *proactor_impl = 0;
- //实例化这个指针
- ACE_NEW_RETURN (proactor_impl,
- ACE_WIN32_Proactor,
- -1);
- //实例化一个ACE的异步反应器类,并和前一个异步反应器接口类绑定
- ACE_NEW_RETURN (this->proactor_,
- ACE_Proactor (proactor_impl, 1 ),
- -1);
- //将异步反应器单体类的实例指向实例化的ACE异步反应器类
- ACE_Proactor::instance (this->proactor_, 1);
- return 0;
- }
- //删除已创建的异步反应器
- void delete_proactor(void)
- {
- if(this->proactor_ != 0)
- {
- ACE_Proactor::close_singleton ();
- this->proactor_ = 0;
- }
- }
- ACE_Thread_Semaphore sem_;//线程池信号
- ACE_Thread_Semaphore sem1_;//线程池信号
- ACE_Proactor * proactor_;//异步反应器实例指针
- };
- //main函数测试
- int ACE_TMAIN(int argc, ACE_TCHAR *argv[])
- {
- SEA_Proactor *test;
- ACE_NEW_RETURN(test, SEA_Proactor, -1);
- test->start(1);
- ACE_OS::sleep(1); //只要有这句话(换成scanf,或者弹出一个框,产生一个耽搁的时间)就要出错
- delete test;
- return 0;
- }
复制代码 |
|