Tôi đã thực hiện một loại "singleton local singleton" bằng cách sử dụng TLS pthread, và tôi tự hỏi làm thế nào (và khi nào) tôi có thể xóa pthread_key_t trong trường hợp này, vì vì bây giờ, bộ nhớ được sử dụng bởi khóa TLS sẽ không bao giờ free'd.Chủ đề Pthread-Local-Singleton, khi nào phát hành Khóa TLS?
Việc sử dụng dự kiến của việc này là để cho một hạng A xuất phát từ ThreadLocalSingleton < Một > mà làm cho A a thread singleton địa phương, giả định rằng A có nhà xây dựng chỉ tin và ThreadLocalSingleton < Một > là một người bạn của A.
Ồ cũng vậy - bạn có thấy bất kỳ vấn đề nào với việc triển khai đó không; tôi đã bỏ qua bất cứ điều gì quan trọng?
#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;
Theo Kerrisk trong [Giao diện lập trình Linux: Sổ tay lập trình hệ thống Linux và UNIX] (http://www.amazon.com/dp/1593272200), tôi tin rằng bạn đang sử dụng * Chủ đề Dữ liệu cụ thể * ('pthread_key_create 'và bạn bè) thay vì * Thread Local Storage * (' __thread' từ khóa trên các biến tĩnh và toàn cục). – jww