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 ?

1voto

geh Points 696

Peut-être cette solution sera-t-elle utile à quelqu'un. C'est la première fois qu'on l'utilise. main() . Avertissement : names s'accroît indéfiniment.

std::string currentThreadName(){
    static std::unordered_map<std::thread::id,std::string> names;
    static std::mutex mtx;

    std::unique_lock<std::mutex> lock(mtx);

    auto id = std::this_thread::get_id();

    if(names.empty()){
        names[id] = "Thread-main";
    } else if(names.find(id) == names.end()){
        std::stringstream stream;
        stream << "Thread-" << names.size();
        names[id] = stream.str();
    }

    return names[id];
}

1voto

Random typ Points 37

En fait, vous pouvez aussi le faire avec la coulée :

std::thread::id threadId = std::this_thread::get_id();    
unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<void*>(&threadId));

J'ai comparé coulée , std::hash y std::stringstream sur un million d'itérations et a trouvé que std::hash es el le plus rapide avec un temps de 1293500ns alors que coulée n'est que de 11 ms plus lent avec 1384200ns y std::stringstream en tant que le plus lent à 351701200ns .

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