如何在 C# 和 Java 进程之间使用互斥体?

Luk*_*uke 3 c# java multithreading ipc

我想使用从 java 到 c# 的内存映射文件来实现消费者-生产者模式。我需要一种从 java 到 c# 的低延迟信号发送方式来读取数据。

在 C# 中,您可以在进程之间使用命名互斥体 (new Mutex(true,"sharedMutex1")),并使用 Mutex.WaitOne() 和 Mutex.ReleaseMutex() 来控制进程之间。

我如何从 Java 进程中执行此操作?

编辑:我知道您可以使用文件锁来执行此操作,但我想远离文件系统以保持低延迟。

编辑:另一种选择是通过 JNI 使用 C++。所以我想我现在想问是否可以直接用Java完成?

Gam*_*lor 5

有多种选择:

  • 正如您提到的,使用基于文件的锁
  • 使用内存映射文件和基于低级内存访问的协议。这很难做到正确,并且您需要访问“sun.misc.Unsafe”操作。我会研究像OpenHFT这样的库,它为您提供了合理的 API,而不是不安全的操作。然而,这仍然很难。
  • 使用 JNI 使用 Win32 / unix API 进行进程间锁定。我建议使用JNAJNR之类的东西,它允许您调用 C api 而无需编写 JNI C 部分。

下面是一个使用 JNA 调用 WIN32 锁 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);
    }
}
Run Code Online (Sandbox Code Playgroud)