JVM 线程是否始终保持它们到 OS 个线程的映射
Will JVM threads always maintain their mapping to OS threads
我正在编写一项服务,该服务使用 JNA 将工作从 Java 委派给本机 C++ 库。 C++ 库对计算量大的任务进行异步调用,然后在该任务完成时获得回调(在不同的 OS 线程上)。我想将这项工作的结果路由回 JVM 中的正确线程。
我想知道的是我能否保证 JVM 线程 ID 始终与本机 thread_id 具有一对一的映射? IE。如果我通过
在 C++ 中记录线程 ID
std::this_thread::get_id()
然后开始一些昂贵的工作并在 cv 上阻塞,工作完成后线程仍然存在,并且我将能够 return 将结果正确地传递给 JVM。任何幕后的 JVM 工作(如 JIT、GC 或停止世界收集)是否会引起对该模式的关注?
JLS、JVM 规范或 Javadoc 中未指定答案。
的确,它可能是特定于平台的。例如,在用于 Solaris 的 JVM 中,可以(或曾经)进行 user-space 线程到 kernel-space 线程的 N:M 映射;参见 this document。目前尚不清楚这对本机线程 ID 意味着什么。
那么对于您正在使用的 JVM,线程的本机 thread_id
会保持不变吗?
只有一种方法可以确定:下载 JVM 源代码并检查。
警告:太复杂了!
(您可能应该将其视为您不应该做这种事情的暗示……如果您不得不求助于 Whosebug 询问它是否有效!)
对我来说这似乎是一个糟糕的设计,这需要您了解 JVM 的工作原理。
如果无论如何都要将一些 Java 数据编组到 C++ 层,为什么不编组回调 + 上下文?当 C++ 线程完成数据处理时,它会使用提供的上下文调用 Java 回调,并在 Java 层中 - 您将结果推回 Java 线程。
C++ 层不应该知道 Java 线程如何工作 - 它所要做的就是调用回调并让回调处理实现细节。
我过去确实做过几次,但在 C# 和 P/Invoke 中,这很容易让您将 C# 函数编组为 C-function 指针。我相信 JNI 也可以。
我正在编写一项服务,该服务使用 JNA 将工作从 Java 委派给本机 C++ 库。 C++ 库对计算量大的任务进行异步调用,然后在该任务完成时获得回调(在不同的 OS 线程上)。我想将这项工作的结果路由回 JVM 中的正确线程。
我想知道的是我能否保证 JVM 线程 ID 始终与本机 thread_id 具有一对一的映射? IE。如果我通过
在 C++ 中记录线程 IDstd::this_thread::get_id()
然后开始一些昂贵的工作并在 cv 上阻塞,工作完成后线程仍然存在,并且我将能够 return 将结果正确地传递给 JVM。任何幕后的 JVM 工作(如 JIT、GC 或停止世界收集)是否会引起对该模式的关注?
JLS、JVM 规范或 Javadoc 中未指定答案。
的确,它可能是特定于平台的。例如,在用于 Solaris 的 JVM 中,可以(或曾经)进行 user-space 线程到 kernel-space 线程的 N:M 映射;参见 this document。目前尚不清楚这对本机线程 ID 意味着什么。
那么对于您正在使用的 JVM,线程的本机 thread_id
会保持不变吗?
只有一种方法可以确定:下载 JVM 源代码并检查。
警告:太复杂了!
(您可能应该将其视为您不应该做这种事情的暗示……如果您不得不求助于 Whosebug 询问它是否有效!)
对我来说这似乎是一个糟糕的设计,这需要您了解 JVM 的工作原理。
如果无论如何都要将一些 Java 数据编组到 C++ 层,为什么不编组回调 + 上下文?当 C++ 线程完成数据处理时,它会使用提供的上下文调用 Java 回调,并在 Java 层中 - 您将结果推回 Java 线程。
C++ 层不应该知道 Java 线程如何工作 - 它所要做的就是调用回调并让回调处理实现细节。
我过去确实做过几次,但在 C# 和 P/Invoke 中,这很容易让您将 C# 函数编组为 C-function 指针。我相信 JNI 也可以。