TAO同步问题
用ACE/TAO开发的服务程序,客户端起动n个进程同时调用服务。发现同时只能有2个进程同时运行。
现象:
创建一个4进程的客户端,有2个进程在调用服务;而另2个进程阻塞。
kill掉正在运行的1个进程,阻塞的2个进程中的1个解除阻塞,继续执行。
又有新发现:
当服务器端的方法运行需要0.5秒时,同时只能有2个进程同时调用服务。
当服务器端的方法运行需要0.05秒时,同时可以有超过4个进程同时调用服务。
很奇怪,有谁知道怎么回事?
先谢了!
[ 本帖最后由 codecola 于 2009-7-15 11:14 编辑 ] 看楼主的描述,恐怕得先确认一下,
是否阻塞在自己的调用上了才好。
回复 #2 modern 的帖子
老大英明,确实阻塞在我自己的调用上了。 这只是一个测试程序。还有一个复杂的CORBA项目,想请教一下。可能设计的不太好,比较复杂。
程序主要分4部分,分别是:ServerController(服务控制器),Server(服务),Agent(代理),AgentDll(代理端动态库)。
idl大致如下:
model MyIdl
{
interface Event
{
string get_msg();
};
interface ServerController
{
void receive_event(in Event event);
void receive_info(in string info);
};
interface Task
{
void set_controller(in ServerController controller);
void start();
void stop();
void send_event(in string event_msg);
ServerController get_controller();
};
interface Server
{
Task creat_task();
};
interface AgentDll;
interface Agent
{
void start_task(in Task task);
void get_status();
void register_dll(in AgentDll dll);
void send_event(in string event_msg);
void send_info(in string info);
};
interface AgentDll
{
void start();
void stop();
};
};
描述:
ServerController调用Server.creat_task()来创建一个Task,再调用Task.set_controller()把自己的CORBA对象传递给Task;
然后可调用Task.start()。
然后Task.start()中会调用Agent.start_task(),由Agent来服务启动一个进程。
这个进程启动时,先获得Agent的CORBA对象,然后创建AgentDll,AgentDll调用Agent的register_dll()把自己的CORBA对象传递给Agent;
然后Agent可以调用AgentDll的start()或stop()来启动或终止该进程。
进程在运行过程中,可以调用Agent的send_event()来发送事件,而Agent又会将消息传递给Task(通过send_event()),再由Task把EVent传递给ServerController(通过receive_event());
也可以通过调用Agent的send_info()来发送消息,而Agent又会通过调用Task的get_controller()获得ServerController的CORBA对象,然后通过调用
ServerController.receive_info()告诉ServerController。
Task定期调用Agent.get_status()来获得进程的状态。
问题:
在启动多个进程的情况下,不定期的出现AgentDll调用Agent.send_event()时阻塞。
在加了进程锁之后,Task又不定期出现调用Agent.get_status()时阻塞。
自己做的简单的测试程序,又没有发现CORBA调用阻塞的情况。
我已经晕了,估计你们更晕。(工作的机器不能上网,请见谅。)
不过还是想请你们帮忙看一下,可能是哪里的问题? 听过CORBA已经过时了,还有人在用?
莫非是历史系统?
页:
[1]