我正在维护一个具有需要线程特定变量的函数的库.由于gcc 4.2中的错误,如果我在x中定义静态__thread; 当通过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";
}
Run Code Online (Sandbox Code Playgroud)
}
注意:如果你想知道,我需要在线程中锁定的原因是为了使这个函数信号安全,以及线程安全.
做一次使用的事情pthread_once:
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;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以get_tls_key()从回调中安全地呼叫以获取TLS密钥,而无需担心创建两个密钥.
| 归档时间: |
|
| 查看次数: |
1285 次 |
| 最近记录: |