108 votes

Comment obtenir l'identifiant d'un thread entier en c++11

C++11 a la possibilité d'obtenir l'identifiant du thread en cours, mais il ne peut être converti en un entier :

cout<<std::this_thread::get_id()<<endl;

sortie : 139918771783456

cout<<(uint64_t)std::this_thread::get_id()<<endl;

error : invalid cast from type 'std::thread::id' to type 'uint64_t' idem pour les autres types : invalid cast from type 'std::thread::id' to type 'uint32_t'

Je ne veux vraiment pas faire de casting de pointeur pour obtenir l'identifiant entier du thread. Il y a t-il un moyen raisonnable (standard parce que je veux que ce soit portable) de le faire ?

114voto

888 Points 1086

Il vous suffit de faire

std::hash<std::thread::id>{}(std::this_thread::get_id())

pour obtenir un size_t .

En cppréférence :

La spécialisation du modèle de std::hash pour les std::thread::id permet aux utilisateurs d'obtenir des hachages des identifiants des threads.

36voto

R. Martinho Fernandes Points 96873

La solution portable consiste à passer vos propres ID générés dans le fil de discussion.

int id = 0;
for(auto& work_item : all_work) {
    std::async(std::launch::async, [id,&work_item]{ work_item(id); });
    ++id;
}

Les std::thread::id doit être utilisé pour les comparaisons uniquement, et non pour l'arithmétique (c'est-à-dire, comme il est indiqué sur la boîte : un identifiant ). Même sa représentation textuelle produite par operator<< es non spécifié On ne peut donc pas s'attendre à ce qu'il représente un nombre.

Vous pouvez également utiliser une carte de std::thread::id à votre propre identifiant, et partagez cette carte (avec une synchronisation appropriée) entre les threads, au lieu de transmettre l'identifiant directement.

33voto

Mike Points 26

Une autre idée (idée ? ^^) serait d'utiliser les stringstreams :

std::stringstream ss;
ss << std::this_thread::get_id();
uint64_t id = std::stoull(ss.str());

Et utilisez try catch si vous ne voulez pas d'exception au cas où les choses tourneraient mal...

10voto

tgoodhart Points 1206

Une idée serait d'utiliser le stockage local des threads pour stocker une variable - peu importe le type, tant qu'il respecte les règles du stockage local des threads - puis d'utiliser l'adresse de cette variable comme "identifiant de thread". Il est évident que l'arithmétique ne sera pas significative, mais il s'agira d'un type intégral.

Pour la postérité : pthread_self() renvoie un pid_t et est posix. C'est portable pour certaines définitions de portable.

gettid() n'est certainement pas portable, mais elle renvoie une valeur compatible avec GDB.

9voto

midjji Points 78

L'une des principales raisons de ne pas utiliser la fonction thread::get_id() est qu'elle n'est pas unique pour un seul programme/processus. En effet, l'identifiant peut être réutilisé pour un deuxième thread, une fois le premier thread terminé.

Cela semble être une fonctionnalité horrible, mais c'est ce qui est prévu dans c++11.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X