![](/img/trans.png)
[英]How to call main thread in the child thread created by pthread_create?
[英]How to create pthread specific variables without __thread
我正在维护一个库,它有一个需要线程特定变量的 function。 由于 gcc 4.2 中的错误,如果我在 x 中定义 static __thread; 当库 function 通过未命名的 API 从 PERL 调用时,它挂起。
我想使用 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";
}
}
注意:如果您想知道,我需要在线程内锁定的原因是为了使这个 function 信号安全,以及线程安全。
使用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;
}
然后,您可以从回调中安全地调用get_tls_key()
来获取 TLS 密钥,而不必担心创建两个密钥。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.