10

我目前在 Java 和 C++ 应用程序之间为 IPC 使用共享内存,但正在寻找更方便的替代方案。

有人可以建议具有相同性能和速度的更好方法吗?

谢谢!

4

5 回答 5

7

这取决于您计划如何让您的应用程序交互。在 POSIX 环境中,您拥有管道、共享内存、套接字、信号量和消息队列。请参阅此问题:比较 unix linux IPC以获取更多信息。

您的流程(即客户端/服务器、生产者-消费者等)的交互模型是什么?

根据个人经验,我建议您最好的选择是管道(因为它们只是用于读取和写入字节的文件)或套接字(因为两种语言都支持它们)。

于 2009-05-24T19:54:30.947 回答
4

正如 mikelong 所说,这在很大程度上取决于您在做什么。AFAIK,没有一个 IPC 方法具有本机 Java 绑定,因此您可能必须使用 JNI 并自己进行绑定,因此所有不同的方法大致同样困难。如果你正在做消息传递,我强烈建议使用消息队列。它们非常易于使用(一旦您拥有绑定),并且具有良好的性能。如果您需要“共享”某些资源,那么您可能希望坚持使用共享内存。

听起来您有某种客户端/服务器的东西,我会说使用消息队列、unix 域套接字或命名管道。它们都涉及在内核中复制数据,因此它们不如共享内存快,但它们仍然非常快。如果您有类似消息的数据(单个小数据包),请使用消息队列。这可能是最干净的解决方案。如果您有更多的数据流,请使用管道或套接字。套接字的优点是您可以在以后轻松地使其成为网络透明(如 X11),但它们比管道更难使用。性能可能非常相似。

于 2009-05-24T19:59:57.970 回答
0

在用不同语言编写的应用程序之间进行通信的最简单方法是 IMHO CORBA。那里有非常好的开源CORBA ORB。我们对 C++使用TAO ,对 Java 使用JacORB。还有像OCIRemedy这样的公司提供技术支持。

于 2009-05-26T20:35:49.650 回答
0

虽然可能不是最有效的,Java 只支持开箱即用的套接字(我记得最好的)。它们非常灵活,只是可能不如其他选项快。正如 Zifre 提到的,它为您提供了网络透明性以及语言/绑定透明性的机会;因为现在几乎每种语言都支持开箱即用的套接字库。

虽然我将效率抛到了窗外,但如果您希望将其提升到一个新的水平,您可能可以将其包装在某种 Web 服务中。在消费者上使用嵌入式 Web 服务器,让生产者向其提交数据。

于 2009-05-25T08:25:48.110 回答
-6

我目前在 Java 和 C++ 应用程序之间为 IPC 使用共享内存,但正在寻找更方便的替代方案。

有人可以建议更好的方法,但性能速度相同吗?

对于简单的共享内存,您甚至不需要特殊的库:

class Main {
    private static class CustomThread extends Thread {
        public int x = 0;
        public void run() {
            x = 5;
        }
    }

    public static void main(String[] args) {

        CustomThread t = new CustomThread();
        t.start();

        System.out.println(t.x);
        System.out.println(t.x);
    }
}

局部变量 x 可以在线程外部和内部访问,允许您使用它来将信息传入和传出线程。

于 2012-04-09T22:48:40.950 回答