.h file :
JavaScript
x
class RedisThreadLocalClient {
public:
RedisThreadLocalClient() {}
virtual ~RedisThreadLocalClient();
public:
static void destroy_client(void* client) {
RedisSyncClient* c = static_cast<RedisSyncClient*>(client);
delete c;
}
static int init(const std::vector<std::string>& address) {
_s_address = address;
return pthread_key_create(&_s_thread_key, RedisThreadLocalClient::destroy_client);
}
static RedisSyncClient* get_client();
private:
static pthread_key_t _s_thread_key;
static std::vector<std::string> _s_address;
};
.cc file
JavaScript
pthread_key_t RedisThreadLocalClient::_s_thread_key;
std::vector< std::string> RedisThreadLocalClient::_s_address;
RedisSyncClient* RedisThreadLocalClient::get_client()
{
RedisSyncClient* client = static_cast<RedisSyncClient*>(pthread_getspecific(_s_thread_key));
if (client != NULL) // HERE
{
return client;
}
RedisSyncClient* c = new RedisSyncClient();
if (c->init(_s_address) != 0)
{
delete c;
return NULL;
}
pthread_setspecific(_s_thread_key, c);
return c;
}
Why is if ( client != NULL )
evaluating as true
when first called in this function? I thought if I haven’t-yet called pthread_setspecific
for the current thread, NULL would be returned from pthread_getspecific
and therefore the result would be false
?
What am I missing?
Advertisement
Answer
pthread_key_create
should be called precisely once, before any use of pthread_getspecific
or pthread_setspecific
with that key.
From http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_key_create.html:
The
pthread_key_create()
call could either be explicitly made in a module initialization routine, or it can be done implicitly by the first call to a module [usingpthread_once
].