C ++ 11 thread_local和“外来”线程

时间:2018-06-30 16:53:40

标签: c++ c++11 stdthread thread-local-storage

我想使用C ++ 11 thread_local,但是我们的应用程序嵌入了JVM,有时C ++方法是通过JNI从Java创建的线程中调用的。这本质上是与外部“ C”库创建线程并调用回我的C ++代码一样的问题。在这种情况下是否定义了thread_local变量的行为?我的代码有什么办法可以补偿外来线程的意外出现吗?线程退出时如何销毁呢?

编辑:实际上,通过JNI从JVM线程调用C ++并不是一个中心点。 任何外来线程(不是由std::threadmain()创建的)都会有相同的问题。

编辑:我感兴趣的JVM是Windows和Linux(Ubuntu和RedHat)上的OpenJDK(nee Oracle)x64实现

2 个答案:

答案 0 :(得分:0)

如果在jni中使用代码。然后,您使用特殊的编译器来编译您的c ++代码。

在示例中,android可以基于NDK调用c ++函数。 并且有特殊的编译器来编译c ++代码。如果代码已编译,则该编译器中将存在函数和实现。

如果外部“ C”库创建了一个线程并调回了我的C ++代码。我的c ++站点上的线程实现是基于工作站的Windows或Linux。该实现将调用特定的代码窗口或Linux以获取我想要的。像c中的fopen或std :: fstream打开。它将调用在编译器中实现的实现。在Linux中,在Windows中打开一些winapi调用。

因此,如果实现,它应该可以工作。

答案 1 :(得分:0)

问题归结于vm的实现和c ++ 11的实现。有很多组合,在您的问题中也没有很好地定义外螺纹的概念。如果我可以将回答的范围限定为外来含义pthread,将vm定义为android,则答案为是。 this llvm source for stdcxx thread使用pthreads实现线程。您的问题并没有直接说明您对哪个VM感兴趣。一些android VM实例(同样,有很多)使用pthread进行线程处理,这是一个过时的示例,eclair