我想使用从 Java 到 C# 的内存映射文件来实现消费者-生产者模式。 我需要一种从 java 到 c# 的低延迟信号发送方式来读取数据。
在 c# 中,您可以在进程之间使用命名互斥锁 (new Mutex(true,"sharedMutex1")) 并使用 Mutex.WaitOne() 和 Mutex.ReleaseMutex() 来控制进程之间。
如何从 Java 进程执行此操作?
编辑:我知道你可以使用文件锁来做到这一点,但我想远离文件系统以保持低延迟。
编辑:另一种选择是通过 JNI 使用 C++。所以我想我现在想问是否可以直接用 Java 完成?
最佳答案
有多种选择:
- 如您所述,使用基于文件的锁定
- 使用内存映射文件和基于低级内存访问的协议(protocol)。这很难做到正确,您需要访问“sun.misc.Unsafe”操作。我会研究像 OpenHFT 这样的库,它为您提供了针对不安全操作的合理 API。然而,这仍然很难。
- 使用 JNI 将 Win32/unix API 用于进程间锁。我建议使用类似 JNA 的东西或 JNR ,它允许您在不编写 JNI C 部分的情况下调用 C api。
这里是一个调用 WIN32 锁 API 的 JNA 示例:
/**
* Definitions of the Win32 API. JNA has some for windows, so check first
* In case CreateMutex is not included.
*/
public interface Kernel32Ex extends Kernel32 {
WinNT.HANDLE CreateMutex(
WinBase.SECURITY_ATTRIBUTES lpMutexAttributes,
boolean bInitialOwner,
String lpName
);
boolean ReleaseMutex(
WinNT.HANDLE hMutex
);
}
public static void main(String[] args) throws Exception {
// The binding. Create it once
final Kernel32Ex Win32 = Native.loadLibrary("kernel32", Kernel32Ex.class, W32APIOptions.UNICODE_OPTIONS);
WinNT.HANDLE handle = Win32.CreateMutex(null,
true,
"My-Mutext");
if (handle == null) {
throw new Win32Exception(Win32.GetLastError());
} else {
System.out.println("Holding the win32 mutex");
Win32.ReleaseMutex(handle);
}
}
关于java - 如何在 C# 和 Java 进程之间使用互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44744804/