我目前正在使用Java和C ++应用程序之间的IPC共享内存,但寻找更方便的替代方案。
有人可以建议一个性能和速度相同的更好的方法吗?
谢谢!
答案 0 :(得分:7)
这取决于您计划如何让应用互动。在POSIX环境中,您有管道,共享内存,套接字,信号量和消息队列。有关详细信息,请参阅此问题:Comparing unix linux IPC。
您的流程(即客户/服务器,生产者 - 消费者等)的交互模型是什么?
从个人经验来看,我建议你最好的选择是管道(因为它们只是读取和写入字节的文件)或套接字(因为两种语言都支持它们)。
答案 1 :(得分:4)
正如米克隆所说,这很大程度上取决于你在做什么。 AFAIK,没有一种IPC方法具有本机Java绑定,因此您可能不得不自己使用JNI并进行绑定,因此所有不同的方法大致同样难。如果你正在传递消息,我强烈建议使用消息队列。它们非常易于使用(一旦你有绑定),并具有良好的性能。如果您需要“共享”某些资源,那么您可能希望坚持使用共享内存。
听起来你有一些客户端/服务器的东西,我会说使用消息队列,unix域套接字或命名管道。它们都涉及在内核中复制数据,因此它们不如共享内存快,但它们仍然非常快。如果您有类似消息的数据(单个小数据包),请使用消息队列。这可能是最干净的解决方案。如果您有更多的数据流,请使用管道或套接字。套接字的优势在于,如果需要,您可以在以后轻松地使网络透明(如X11),但它们比管道更难以使用。表现可能非常相似。
答案 2 :(得分:0)
虽然可能不是最有效的,但Java只支持开箱即用的套接字(我记得最好)。它们非常灵活,可能没有其他选项那么快。正如Zifre所说,它为您提供了网络透明度以及语言/绑定透明度的机会;因为现在几乎所有语言都支持开箱即用的套接字库。
虽然我将效率从窗口中抛出,但如果你希望将它提升到一个新的水平,你可以将它包装在某种Web服务中。在使用者身上使用嵌入式Web服务器,生产者可以将数据提交给。
答案 3 :(得分:0)
使用不同语言编写的应用程序之间进行通信的最简单方法是IMHO CORBA。那里有非常好的开源CORBA ORBs。我们对C ++使用TAO,对Java使用JacORB。还有OCI和Remedy等公司提供技术支持。
答案 4 :(得分:-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可以在线程外部访问,允许您使用它来传递信息进出线程。