当前位置: 首页 > 知识库问答 >
问题:

从Java的多线程并行调用非线程安全DLL函数

周睿范
2023-03-14

虽然我的C程序显然不是线程安全的,但我需要从Java的多线程并行调用它。由于性能问题,我无法重写C代码,需要执行通过并行编译C程序创建的DLL。

如何从Java的多线程调用非线程安全的C函数?

我尝试的是使用JNA并在每次线程调用DLL函数时调用Native#loadLibrary。但是,它并没有解决这个问题,并且出现了分割错误。

public static class MyRunnable implements Runnable{
  ...
  public void run(){
    MyCLibrary INSTANCE = (MyCLibrary)Native.loadLibrary(MyCLibrary.JNA_LIBRARY_NAME, MyCLibrary.class);
    INSTANCE.cfunc()
  }  
  ...
}

我认为DLL的新内存空间是通过调用Native#loadLibrary分配的,应该避免重入问题。但是,我的想法可能是错误的。

我搜索了从Java为DLL创建多个内存空间的正确方法,但找不到它。

共有1个答案

明财
2023-03-14

如何从Java的多线程调用非线程安全的C函数?

你不能。您不能这样做,因为C函数不是线程安全的1

我搜索了从Java为DLL创建多个内存空间的正确方法,但找不到它。

没有办法做到这一点。(阿法克)

你的选择是:

>

  • 将对C函数的调用限制为单个Java线程。。。或者一次一根线。(在后一种情况下,不可能是不安全的。)

    启动多个子进程以(每个)运行调用该函数的C应用程序。通过进程管道或使用网络消息、RPC等传递参数和结果。(问题是Java应用程序

    重写C代码以使其线程安全。

    最后一种方法会给你最好的表现。

    1-这可能夸大了情况。这可能取决于为什么C函数不是线程安全的。但如果问题是。。。正如我所怀疑的。。。如果函数使用静态变量来保持状态,那么情况就是I状态

  •  类似资料:
    • 我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢

    • 问题内容: 我从一个非常简单的多线程示例开始。我试图做一个线程安全的计数器。我想创建两个线程,使计数器间歇地增加到1000。以下代码: 据我所知,while循环现在意味着只有第一个线程才能访问计数器,直到达到1000。输出: 我该如何解决?如何获得共享计数器的线程? 问题答案: 两个线程都可以访问您的变量。 您看到的现象称为线程饥饿。输入代码的受保护部分后(很抱歉,我之前错过了它),其他线程将需要

    • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

    • 如果有多个Java线程同时写入同一个套接字实例,这会影响从同一个套接字读取的对象的完整性吗?例如,对象的内容是否会被弄乱等。对象的顺序可以是随机的。

    • 问题内容: 鉴于以下多态: 我们如何在没有昂贵的getInstance()方法同步和双重检查锁定争议的情况下使它保持线程安全和懒惰?这里提到了单例的有效方法,但似乎并没有扩展到多例。 问题答案: 使用Java 8,它甚至可以更简单:

    • 并发是什么?引用Rob Pike的经典描述: 并发是同一时间应对多件事情的能力 其实在我们身边就有很多并发的事情,比如一边上课,一边发短信;一边给小孩喂奶,一边看电视,只要你细心留意,就会发现许多类似的事。相应地,在软件的世界里,我们也会发现这样的事,比如一边写博客,一边听音乐;一边看网页,一边下载软件等等。显而易见这样会节约不少时间,干更多的事。然而一开始计算机系统并不能同时处理两件事,这明显满