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

标签 java c# multithreading ipc

我想使用从 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/

相关文章:

java - 如何解密 Jenkins 8mha 值

java - 使用比较器排序映射导致语法错误

c# - 单击按钮获取选定行

c# - 检测到与 ASP.NET SignalR 服务器的连接尝试。此客户端仅支持连接到 ASP.NET Core SignalR 服务器

java - 观察者/可观察模式的链接

java - Scala:如果字符串为空,是否有帮助程序获取 Option[String]?

java - 无法在SQL中使用prepareStatement

C# - 裁剪透明/空白

c - C 线程程序中的链接器错误..ld 返回 1 退出状态

ruby-on-rails - Rails 4 多线程和 connection_pool 问题