C++ 如何在没有线程的情况下创建特定于pthread的变量

C++ 如何在没有线程的情况下创建特定于pthread的变量,c++,pthreads,C++,Pthreads,我正在维护一个库,它有一个需要线程特定变量的函数。 由于GCC4.2中的错误,如果我定义 x中的静态螺纹; 当从PERL通过未命名的API调用库函数时,它将挂起 我想使用pthread_key_create()定义线程局部变量,但我需要这样做 在库中,当创建线程时,我没有收到任何特殊调用 如何创建线程局部变量(仅当它不存在时)? 差不多 pthread_key_t tlsKey = 0; int x; myfunc() { if (pthread_key_t == 0){

我正在维护一个库,它有一个需要线程特定变量的函数。 由于GCC4.2中的错误,如果我定义 x中的静态螺纹; 当从PERL通过未命名的API调用库函数时,它将挂起

我想使用pthread_key_create()定义线程局部变量,但我需要这样做 在库中,当创建线程时,我没有收到任何特殊调用

如何创建线程局部变量(仅当它不存在时)? 差不多

pthread_key_t   tlsKey = 0;
int x;

myfunc()
{
    if (pthread_key_t == 0){
        pthread_key_create(&tlsKey, NULL);
        pthread_setspecific(tlsKey, &x);
    }
    int& myx = pthread_getspecific(tlskey);
    if (myx == 0){
       myx=1;
       something_under_myx_lock();
       myx = 0;
    } else {
      cout << "locked in thread\n";
    }
pthread_key_t tlsKey=0;
int x;
myfunc()
{
if(pthread_key_t==0){
pthread_key_create(&tlsKey,NULL);
pthread_setspecific(tlsKey和&x);
}
int&myx=pthread_getspecific(tlskey);
如果(myx==0){
myx=1;
在锁()下的东西;
myx=0;
}否则{
一旦使用,就不能做某事:

然后,您可以从回调中安全地调用
get\u tls\u key()
以获取tls密钥,而无需担心创建两个密钥。

问题被标记为“C++”因此,我假设ASKER使用C++编译器。<代码> pthRead一次是C函数,并期望传递的函数是C函数的指针。C++和C函数不一定具有相同的调用约定/ABI,因此<>代码>外“C”< /> >是技术上必要的。在一些编译器/平台上,可以省略。
pthread_key_t tls_key;
pthread_once_t tls_init_flag=PTHREAD_ONCE_INIT;

extern "C"
{
    static void tls_destructor(void*); // run when thread exits to cleanup TLS data
    static void create_tls_key()
    {
        if(pthread_key_create(&tls_key,tls_destructor))
        {
            abort();
        }
    }
}

pthread_key_t get_tls_key()
{
    pthread_once(&tls_init_flag,create_tls_key);
    return tls_key;
}