如何在 c# 和 java 进程之间使用互斥锁?
How can you use a mutex between c# and java processes?
我想使用从 java 到 c# 的内存映射文件来实现消费者-生产者模式。
我需要一种从 java 向 c# 发送信号的低延迟方式来读取数据。
在 c# 中,您可以在进程之间使用命名互斥锁 (new Mutex(true,"sharedMutex1")) 并使用 Mutex.WaitOne() 和
Mutex.ReleaseMutex() 控制进程之间。
如何从 Java 进程执行此操作?
编辑:我知道你可以使用文件锁来做到这一点,但我想远离文件系统以保持低延迟。
编辑:另一种选择是通过 JNI 使用 C++。所以我想我现在问是否可以直接在 Java 中完成?
有多个选项:
- 如您所述,使用基于文件的锁定
- 使用内存映射文件和基于低级内存访问的协议。这很难做到正确,您需要访问 'sun.misc.Unsafe' 操作。我会研究像 OpenHFT 这样的库,它为您提供了合理的 API 来应对不安全的操作。然而,还是很难。
- 使用 JNI 将 Win32/unix API 用于进程间锁。我建议使用类似 JNA or JNR 的东西,它允许您在不编写 JNI C 部分的情况下调用 C api。
这里是调用 WIN32 锁的 JNA 示例 API:
/**
* 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 向 c# 发送信号的低延迟方式来读取数据。
在 c# 中,您可以在进程之间使用命名互斥锁 (new Mutex(true,"sharedMutex1")) 并使用 Mutex.WaitOne() 和 Mutex.ReleaseMutex() 控制进程之间。
如何从 Java 进程执行此操作?
编辑:我知道你可以使用文件锁来做到这一点,但我想远离文件系统以保持低延迟。
编辑:另一种选择是通过 JNI 使用 C++。所以我想我现在问是否可以直接在 Java 中完成?
有多个选项:
- 如您所述,使用基于文件的锁定
- 使用内存映射文件和基于低级内存访问的协议。这很难做到正确,您需要访问 'sun.misc.Unsafe' 操作。我会研究像 OpenHFT 这样的库,它为您提供了合理的 API 来应对不安全的操作。然而,还是很难。
- 使用 JNI 将 Win32/unix API 用于进程间锁。我建议使用类似 JNA or JNR 的东西,它允许您在不编写 JNI C 部分的情况下调用 C api。
这里是调用 WIN32 锁的 JNA 示例 API:
/**
* 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);
}
}