2013-04-22 16 views
5

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; 
+0

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

Trả lời

2

Triển khai của bạn trông rất thanh lịch.

Theo Open Group Specification of pthread_key_create, bạn không cần phải thiết lập các tham chiếu đến NULL trong destructor:

Một chức năng destructor tùy chọn có thể được liên kết với mỗi giá trị then chốt. Tại lối ra thread, nếu giá trị khóa có con trỏ hủy không NULL, và chuỗi có giá trị không NULL kết hợp với khóa đó, giá trị của khóa được đặt thành NULL và sau đó hàm được trỏ đến được gọi với giá trị được liên kết trước đó làm đối số duy nhất của nó.

Tôi nghĩ điều này cũng ngụ ý rằng chính đối tượng chính sẽ được tự động sửa bằng pthread. Bạn chỉ phải chăm sóc những gì được lưu trữ đằng sau khóa, đó chính xác là những gì mà delete ((T*)obj); của bạn thực hiện.

Các vấn đề liên quan