boost::thread:id to string


  • Administrator

    Und wozu brauchst du dann die boost::thread::id ? Du willst die doch nicht etwas mitausgeben? Dazu nimmst du doch viel besser einen Namen für den Thread. Den Namen kannst du in thread-lokalen Speicher halten. In C++11 gibt es dazu das Schlüsselwort thread_local . Mit Boost kannst du boost::thread_specific_ptr<T> verwenden.

    Grüssli



  • Dravere schrieb:

    In C++11 gibt es dazu das Schlüsselwort thread_local . Mit Boost kannst du boost::thread_specific_ptr<T> verwenden.

    thread_specific kannt ich bis jetzt noch gar nicht. Scheint eine gute Idee zu sein. Leider finde ich keine gute Doku hierzu.
    - Kannst du ein kleines Beispiel hierzu (C++11 und boost::thread_specific_ptr) geben?

    Danke


  • Administrator

    Doku? So schwer sollte dies doch nicht zu verstehen sein? Irgendwas in diese Richtung:

    class Logger
    {
    private:
      static thread_local char const* thread_name;
    
    public:
      static void register_name(char const* name)
      {
        thread_name = name;
      }
    };
    

    Jeder Thread ruft halt register_name auf mit dem Namen, welcher er verwenden will. Die Variable thread_name ist für jeden Thread separat vorhanden. thread_local ist aber bisher nach meinem Wissen noch von keinem Kompiler unterstützt. Obwohl dies ein wenig verwunderlich ist, hat doch MSVC das Schlüsselwort __declspec(thread) und GCC __thread .

    Bei Boost müsste es ähnlich funktionieren:

    class Logger
    {
    private:
      static void thread_name_cleanup(char const*) {}
      static boost::thread_specific_ptr<char const> thread_name;
    
    public:
      static void register_name(char const* name)
      {
        thread_name.reset(name);
      }
    };
    
    boost::thread_specific_ptr<char const> Logger::thread_name(&Logger::thread_name_cleanup);
    

    Hab leider kein Boost hier zur Verfügung, kann es daher nicht testen.

    Grüssli



  • Hallo,

    so weit ist mir das alles klar. Bei boost::thread_specific_ptr kann man angeben, wie der Speicher wieder freigegeben wird. Aber wie sieht es bei thread_local aus? Wie kann ich hier den Standard-Delete-Operator angeben?

    Der Speicher für char* kann ja über
    - new
    - malloc
    - pool
    angefordert werden.


  • Administrator

    Siassei schrieb:

    Aber wie sieht es bei thread_local aus? Wie kann ich hier den Standard-Delete-Operator angeben?

    Stichwort: RAII.
    Die thread_local Variable kann auch eine Klasse sein mit einem Destruktur. Der Destruktur wird aufgerufen, wenn der Thread beendet wird.

    Grüssli



  • Ich denke da reden wir jetzt aneinander vorbei

    Das dürfte kein Problem sein

    class A { ... };
    thread_local A *instance = new A ();
    

    Problem?

    class A { ... };
    void* raw = malloc (sizeof (A));
    thread_local A *instance = new A(raw)();
    
    // instance->~A();
    // free (instance);
    

    Problem?

    class A { ... };
    thread_local A *instance = myPool.getInstance<A> ();
    
    // myPool.destroy (instance);
    

  • Administrator

    Wieso nimmst du immer einen Zeiger? Nimm RAII! Nimm einen Container, welcher den Speicher verwaltet. Also z.B. für einen Namen:

    static thread_local std::string thread_name;
    

    Wenn du mit einem Pool arbeitest, brauchst du halt einen Smart Pointer dafür:

    static thread_local pool_ptr<A> instance = myPool.getInstance<A>();
    

    In seinem Destruktur gibt er den Speicher frei im Pool.

    Grüssli



  • ⚠ Brett vorm Kopf ⚠



  • @Dravere: Es heißt übrigens Destruktor 😉


  • Administrator

    314159265358979 schrieb:

    @Dravere: Es heißt übrigens Destruktor 😉

    Weiss ich doch.
    *sich fragt, wieso pi diese Aussage macht*
    *seine Beiträge nachlesen geht*
    ... hö? 😮 ... 😕

    *nach Erklärungen sucht*
    Ich hatte noch keinen Kaffee! 😃

    Grüssli


Anmelden zum Antworten