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