boost::thread:id to string
-
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üsselwortthread_local. Mit Boost kannst duboost::thread_specific_ptr<T>verwenden.Grüssli
-
Dravere schrieb:
In C++11 gibt es dazu das Schlüsselwort
thread_local. Mit Boost kannst duboost::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
-
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_nameauf mit dem Namen, welcher er verwenden will. Die Variablethread_nameist für jeden Thread separat vorhanden.thread_localist 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.
-
Siassei schrieb:
Aber wie sieht es bei thread_local aus? Wie kann ich hier den Standard-Delete-Operator angeben?
Stichwort: RAII.
Diethread_localVariable 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);
-
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

-
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