wishel 发表于 2008-8-3 23:26:00

int ACE_TMAIN (int argc, ACE_TCHAR *argv []) {
ACE_Proactor::instance ();
ACE_Thread_Manager::instance ()->wait ();
return 0;
}
这个跑不完

int ACE_TMAIN (int argc, ACE_TCHAR *argv []) {
ACE_Thread_Manager::instance ()->wait ();
return 0;
}
这个就能跑完
你说有没有冲突?
这么简单的程序还说我用法不对头?我根本就没用那个proactor,就是产生了一个singleton的实例而已

wishel 发表于 2008-8-3 23:32:57

或者把proactor换成reactor
int ACE_TMAIN (int argc, ACE_TCHAR *argv [])
{
ACE_Reactor::instance ();
ACE_Thread_Manager::instance ()->wait ();
return 0;
}
也能顺利跑完,可以确定是一个bug
产生一个proactor的singleton实例(第一次用所以新产生),不应该产生任何新线程,更不应该让ACE_Thread_Manager::instance ()->wait ()阻塞,这是不符合proactor的语义的。

wishel 发表于 2008-8-4 12:04:10

int ACE_TMAIN (int argc, ACE_TCHAR *argv [])
{
ACE_WIN32_Proactor win32_proactor (0, 0); //win32下的缺省ACE_Proactor_Impl
ACE_Thread_Manager::instance ()->wait ();

//can not reach here!!!
return 0;
}
也不行,我这边没有unix环境,不知道其他的imp行不行

[ 本帖最后由 wishel 于 2008-8-4 12:05 编辑 ]

winston 发表于 2008-8-4 12:37:10

你先搞明白:ACE_Thread_Manager::instance ()->wait ();
是什么意思,再来问大家。
其实ACE_Thread_Manager::instance ()一般用wait_task功能。wait是等所有线程退出。
如:
tm->wait_task (&m_task_obj);

wishel 发表于 2008-8-4 12:48:57

晕。。我不是在问大家,我是在回答楼主问题
恰恰是你没搞明白ACE_Thread_Manager::instance ()->wait ()是什么意思
建议你再去看书,C++NPv1 p189(英文版),表里说的很明白了

还有在examples\Reactor\Proactor下面还有一个测试程序test_multiple_loops.cpp,有同样的问题,最后一行romove是执行不到的

wishel 发表于 2008-8-4 12:50:39

作为版主回答问题要负责任,这么简单的问题,自己亲自调一下就很明白,这个程序很简单也花不了几分钟时间。然后再来回答网友提问,特别是有争议的情况下。

winston 发表于 2008-8-4 13:30:50

谢谢批评。
版主不是神,也没义务做那么多FREE的事情。大家只是交流和沟通而已。
此贴是旧帖“翻新”,我理解有误,不好意思。你的回答是正确的。最好不要用wait,我也是用task代替。
用wait,必须有外面的中断措施。

wishel 发表于 2008-8-4 20:01:53

抱歉我说的重了点,版主辛苦了,希望以后多交流经验。

xenium_lee 发表于 2008-9-16 16:23:51

我也碰到了,我觉得是ACE_WIN32_Proactor构造函数中this->get_asynch_pseudo_task ().start (); 这一句派生了一个线程,异步connect用的。这个线程在ACE_WIN32_Proactor析构函数中会终止,所以只需要等待运行proactor循环的线程。
ACE_Thread_Manager::instance ()->join(t_id), t_id是spwan的返回值。
页: 1 [2]
查看完整版本: Proactor 自带例子 问题