【发布时间】:2017-11-09 12:45:27
【问题描述】:
我可以将Schwarz counter (aka Nifty counter) 与thread_local 一起使用吗? (假设我将所有static 替换为thread_local)
我需要这个(java jni 线程的助手):
class ThisThread{
JNIEnv* jni_env{nullptr};
public:
JNIEnv* getEnv(){
if (!jni_env){
// Attach thread
java_vm->GetEnv((void**)&jni_env, JNI_VERSION);
java_vm->AttachCurrentThread(&jni_env, NULL);
}
return jni_env;
}
~ThisThread(){
if (!jni_env) return;
// Deattach thread
java_vm->DetachCurrentThread();
}
};
static thread_local ThisThread this_thread;
在每个线程中首先构造,最后销毁。
我可以从其他静态或 thread_local 对象的析构函数/构造函数中调用 this_thread->getEnv()。
更新
https://stackoverflow.com/a/30200992 - 在这里,标准说 thread_local 析构函数在静态之前调用,我需要这个之后。
【问题讨论】:
-
您还需要对 ThisThread 的引用也是 thread_local。
-
@RichardHodges 你是什么意思?
-
秒,将敲出一个演示
-
这是一个有效的包装器:w01fe.com/blog/2009/05/…
-
@AlexCohn 与问题相同。并且有同样的问题——它的析构函数可能在其他 thread_local 和静态析构函数之前被调用。我想我几乎有这个通用的解决方案,我会用这个发布答案。 Richard Hodges 单独使用 thread_local 漂亮的计数器是不够的,因为静态析构函数也可能尝试访问 env(并且 thread_local 在静态 + 销毁之前被破坏可能不在主线程 stackoverflow.com/a/47208350/1559666 上发生)。
标签: c++ java-native-interface static-order-fiasco