Boost :: this_thread :: get_id () fără operație de șir

eu sunt într-o situație în care am nevoie pentru a obține boost :: thread :: id într-o variabilă, dar această variabilă nu este un șir, nici o operație șir este permisă. este posibil?

poate ceva de genul

char * tid = (turnare ceva) boost :: this_thread :: get_id()

aceasta este c ++ pe sistemul UNIX. motivul pentru care evitarea utilizării operației de șir este datorită încetinirii întregii viteze a aplicației. multumesc aniticipat.

2
Amintiți-vă că optimizarea prematură este rădăcina întregului rău. Sunteți sigur că utilizarea unei operațiuni de șir aici ar afecta în mod semnificativ performanța dvs.?
adăugat autor Björn Pollex, sursa
Sunteți sigur că șirurile sunt lente? L-ai profilat?
adăugat autor rve, sursa

2 răspunsuri

În orice caz, întrebarea dvs. pare să se bazeze în întregime pe o concepție greșită. Dacă doriți să obțineți boost :: thread :: id într-o variabilă, variabila ar trebui să fie de tip boost :: thread :: id . Asa:

boost::thread::id MyVariable = boost::thread::get_id();

Nu sunt implicate niciun fel de corzi. De ce încercați să îl aruncați într-un char * ?

Dacă firele dvs. trebuie să obțină codurile de identitate atât de des încât generează o strangulare, probabil că faceți ceva greșit greșit. De ce aveți nevoie de ID-ul firului atât de mult?

Update: Okay, so you need a thread ID that has specific semantics. You need to assign threads IDs that have the semantics you require. (There is no guarantee that whatever ID the threads already have is usable in a file name.) In pseudo-code:

  1. Apelați get_id.
  2. Căutați ID-ul pe care l-ați recuperat într-o hartă.
  3. Dacă ați găsit o intrare pentru acest cod, returnați valoarea, ați terminat.
  4. Acest fir nu are cod ID care poate fi folosit într-un nume de fișier. Deci, atribuiți unul. Păstrați perechea ID-ului pe care l-ați primit de la get_id și ID-ul pe care tocmai l-ați alocat în hartă. Acest lucru va asigura că următoarea dată când încercați să obțineți o intrare pentru acest thread, veți obține aceeași.

Alternativ, platforma dvs. poate avea o funcție care oferă semantica de care aveți nevoie. De exemplu, Linux are gettid și NT are GetCurrentThreadId .

6
adăugat
Vreau să creez un fișier tmp care se bazează pe ID-ul firului. astfel încât, în principiu, numele fișierului tmp va fi ceva de genul TRHEADID_file.txt și preluarea ID-ului se face doar o dată, la începutul codului.
adăugat autor user777305, sursa

Ce ziceti:

std::ostringstream oss;
oss << boost::thread::get_id();
std::string idAsString = oss.str();

See the documentation on boost::thread::id

Actualizați: Deoarece deja utilizați stimulent, de ce nu utilizați:

std::string id = boost::lexical_cast(boost::thread::get_id());

De asemenea, pe măsură ce faci asta doar la început viteza nu ar trebui să fie o problemă.

4
adăugat