【问题标题】:How can you use a mutex between c# and java processes?如何在 c# 和 java 进程之间使用互斥锁?
【发布时间】:2017-11-28 09:55:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你有没有向强大的谷歌寻求答案?你自己尝试过什么吗?
  • 我在 java 中看不到任何可以做到这一点的东西。
  • google 上的第一条结果:stackoverflow.com/questions/41866893/…
  • 谢谢,所以您需要通过 JNI 使用 c++。有没有不诉诸于此的java解决方案?
  • 如果您真的需要低延迟解决方案,请对共享内存区域中的值使用忙等待。确保该值在其自己的缓存行中单独存在以避免错误共享,并且它已正确对齐。使用联锁比较交换来翻转它 (Interlocked.CompareExchange(ref *ptr, 1, 0))。您将拥有自己的互斥锁实现,而无需涉及内核。

标签: java c# multithreading ipc


【解决方案1】:

有多种选择:

  • 如您所述,使用基于文件的锁
  • 使用内存映射文件和基于低级内存访问的协议。这很难解决,您需要访问“sun.misc.Unsafe”操作。我会研究像 OpenHFT 这样的库,它为您提供了合理的 API,而不是不安全的操作。但是,这仍然很难。
  • 使用 JNI 将 Win32 / unix API 用于进程间锁定。我建议使用JNAJNR 之类的东西,这样您就可以在不编写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);
    }
}

【讨论】:

  • 感谢分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2022-08-21
  • 2013-12-17
  • 2011-09-22
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多