我想使用 C++ 11 thread_local
,但我们的应用程序嵌入了一个 JVM,有时 C++ 方法是通过 JNI 从 Java 创建的线程调用的。这本质上是同一个问题,就好像外部“C”库创建了一个线程并回调到我的 C++ 代码中一样。 thread_local
变量的行为是在这些情况下定义的吗?我的代码有什么方法可以补偿意外出现的外来线程吗?线程退出时的销毁怎么样?
编辑:C++ 是通过 JNI 从 JVM 线程调用的事实并不是真正的中心点。 任何外来线程(不是由 std::thread
或 main()
创建的)大概都会有同样的问题。
编辑:我感兴趣的 JVM 是 Windows 和 Linux(Ubuntu 和 RedHat)上的 OpenJDK(nee Oracle)x64 实现
最佳答案
如果你在 jni 中使用你的代码。然后你使用特殊的编译器来编译你的c++代码。
例如android可以调用基于NDK的c++函数。 并且有专门的编译器来编译c++代码。如果代码已编译,则此编译器中存在函数和实现。
如果外部“C”库创建了一个线程并回调到我的 C++ 代码中。我的 c++ 站点上的线程实现将是基于工作站的 Windows 或 Linux。该实现将调用特定的代码窗口或 Linux 来获得我想要的。就像 c 中的 fopen 或 std::fstream 打开。它将调用在编译器中实现的实现。在linux下在windows下打开一些winapi调用。
因此,如果实现它应该会起作用。
关于C++ 11 thread_local 和 "foreign"线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51116820/