找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5638|回复: 4

TAO同步问题

[复制链接]
发表于 2009-7-15 10:53:55 | 显示全部楼层 |阅读模式
用ACE/TAO开发的服务程序,客户端起动n个进程同时调用服务。
发现同时只能有2个进程同时运行。

现象:
创建一个4进程的客户端,有2个进程在调用服务;而另2个进程阻塞。
kill掉正在运行的1个进程,阻塞的2个进程中的1个解除阻塞,继续执行。

又有新发现:
当服务器端的方法运行需要0.5秒时,同时只能有2个进程同时调用服务。
当服务器端的方法运行需要0.05秒时,同时可以有超过4个进程同时调用服务。

很奇怪,有谁知道怎么回事?
先谢了!

[ 本帖最后由 codecola 于 2009-7-15 11:14 编辑 ]
发表于 2009-7-15 13:03:49 | 显示全部楼层
看楼主的描述,恐怕得先确认一下,
是否阻塞在自己的调用上了才好。
 楼主| 发表于 2009-7-15 14:34:04 | 显示全部楼层

回复 #2 modern 的帖子

老大英明,确实阻塞在我自己的调用上了。
 楼主| 发表于 2009-7-15 14:34:21 | 显示全部楼层
这只是一个测试程序。还有一个复杂的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调用阻塞的情况。

我已经晕了,估计你们更晕。(工作的机器不能上网,请见谅。)

不过还是想请你们帮忙看一下,可能是哪里的问题?
发表于 2010-3-4 13:09:17 | 显示全部楼层
听过CORBA已经过时了,还有人在用?
莫非是历史系统?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 02:55 , Processed in 0.019725 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表