मैंने पर्थ्रेड टीएलएस का उपयोग करके एक प्रकार का "थ्रेड लोकल सिंगलटन" लागू किया, और मुझे आश्चर्य हुआ कि कैसे (और कब) मैं इस मामले में pthread_key_t को संभवतः हटा सकता हूं, क्योंकि अब यह है कि टीएलएस कुंजी द्वारा उपयोग की जाने वाली मेमोरी कभी नहीं होगी मुक्त किया गया।पर्थ्रेड थ्रेड-लोकल-सिंगलटन, टीएलएस कुंजी कब जारी करें?
इस का उद्देश्य उपयोग एक वर्ग एक ThreadLocalSingleton < से निकाले जाते हैं एक > जो एक एक धागा स्थानीय सिंगलटन बनाता है, यह सोचते हैं कि एक ही निजी निर्माणकर्ता और है ThreadLocalSingleton < एक > ए के मित्र हैं यह बताने के लिए है
ओह और भी - क्या आप उस कार्यान्वयन के साथ कोई समस्या देखते हैं; क्या मैंने कुछ भी महत्वपूर्ण देखा?
#include <pthread.h>
#include <iostream>
template <class T>
class ThreadLocalSingleton
{
private:
static pthread_key_t tlsKey;
static pthread_once_t tlsKey_once;
static void tls_make_key()
{
(void)pthread_key_create(&ThreadLocalSingleton::tlsKey, ThreadLocalSingleton::tls_destructor);
}
static void tls_destructor(void* obj)
{
delete ((T*)obj);
pthread_setspecific(tlsKey, NULL); // necessary or it will call the destructor again.
}
public:
/*
* A thread-local singleton getter, the resulted object must never be released,
* it is auto-released when the thread exits.
*/
static T* getThreadInstance(void)
{
pthread_once(&tlsKey_once, ThreadLocalSingleton::tls_make_key);
T* instance = (T*)pthread_getspecific(tlsKey);
if(!instance)
{
try
{
instance = new T;
pthread_setspecific(tlsKey, instance);
}
catch (const char* ex)
{
printf("Exception during thread local singleton init: %s\n",ex);
}
}
return instance;
}
};
template <class T>
pthread_key_t ThreadLocalSingleton<T>::tlsKey;
template <class T>
pthread_once_t ThreadLocalSingleton<T>::tlsKey_once = PTHREAD_ONCE_INIT;
[लिनक्स प्रोग्रामिंग इंटरफेस: एक लिनक्स और यूनिक्स सिस्टम प्रोग्रामिंग हैंडबुक] (http://www.amazon.com/dp/1593272200) में केरिस्क के अनुसार, मुझे विश्वास है कि आप * थ्रेड विशिष्ट डेटा * ('pthread_key_create) का उपयोग कर रहे हैं 'और दोस्तों) बल्कि * थ्रेड स्थानीय संग्रहण * (स्थिर और वैश्विक चर पर' __thread' कीवर्ड)। – jww