【问题标题】:Attaching third party thread to vm when using jni使用 jni 时将第三方线程附加到 vm
【发布时间】:2012-04-06 01:20:39
【问题描述】:

我正在编写一个使用 c 语言编写的硬件驱动程序的 Java 程序。该硬件驱动程序启动一个回调线程,您可以注册回调函数以在发生事情时调用。如何将此线程附加到 jvm,以便它可以为这些回调调用 Java 方法?我只有从 start_callbacks() 函数返回的线程 id,以 int 形式返回,但它是调用 pthread_create() 时使用的 pthread_t。

我发现的一种方法是在每个回调函数的开头使用 pthread_once 并将线程附加到那里。但是,没有办法将其分离。我尝试使用 pthread_cleanup_push/pop,但它们需要成对调用,这样不起作用。

在我看来,我唯一的选择是在每次回调调用时附加和分离线程。或者重写驱动程序,我真的不想这样做。

我错过了什么吗?

【问题讨论】:

  • 这可能没什么用,但是您是否考虑过用 C 实现该程序,并使用 System.exec 或其他东西将其连接到 Java?您当前的方法对我来说似乎在技术上存在风险。

标签: java c java-native-interface pthreads


【解决方案1】:

这正是 JNI 所称的 AttachCurrentThread()DetachCurrentThread() 的用途。

【讨论】:

  • 是的,我知道。但是我自己没有创建线程,那么如何让线程调用 AttachCurrenThread 和 DetachCurrentThread?我可以让线程执行的唯一代码是回调函数。
  • 你不需要'线程调用AttachCurrentThread()'。它附加当前线程。这就是为什么它被称为AttachCurrentThread()。显然你必须在回调函数中调用这些方法。
  • 我知道这是解决问题的方法,每次进行回调时都进行附加和分离。但我希望有一种方法可以让线程在适当的时间调用 AttachCurrentThread 和 DetachCurrentThread,只需一次。这样我就不需要在每次进行回调时都附加线程。我可能高估了附加线程的成本,回调的频率是几秒钟,所以它可能不是问题。我宁愿只附加和分离线程一次,每次调用时附加和分离线程的正确方法是什么?
  • @leie 我会先让它工作,然后再评估。但是半秒在计算中是永远的。
【解决方案2】:

可以使用 thread_local 存储(C++ 11 及更高版本)解决您的问题。这允许您附加到任意线程,然后当线程存在时它会自动分离(即使您没有创建线程并且无法控制它的生命周期)。

可以在我的回答中找到如何在 C++ 中实现该功能的示例: https://stackoverflow.com/a/59934966/8367574

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多