2010-05-17 6 views
3

Selon le documentation, un boost::thread::id peut être considéré comme unique pour chaque thread en cours d'exécution et peut être utilisé dans des conteneurs tels que std::set et std::map (parce que l'opérateur < est surchargée pour thread::id).Comment puis-je utiliser boost :: thread :: id comme clé d'unordord_map?

Mon problème est que je voudrais utiliser thread::id comme clé d'un boost::unordered_map, mais il faut que la clé est « indexables » (ie. Supports de hachage à un size_t). Puisque tous les détails d'implémentation pour thread :: id sont cachés, je ne pense pas avoir quelque chose que je puisse utiliser.

Donc, ma question est - est-il possible d'utiliser thread :: id comme une clé à unordered_map?

+2

question connexe: http://stackoverflow.com/questions/772192/tr1hash-for-boostthreadid –

Répondre

5

Vous pouvez utiliser la capacité de streaming:

struct Hasher 
{ 
    size_t operator()(const boost::thread::id& id) 
    { 
    std::ostringstream os; os << id; return hash(os.str()); 
    } 
}; 

Petit extrait de la classe, de sorte que d'autres peuvent voir ce qui est possible:

class thread::id 
{ 
public: 
    id(); 

    bool operator==(const id& y) const; 
    bool operator!=(const id& y) const; 
    bool operator<(const id& y) const; 
    bool operator>(const id& y) const; 
    bool operator<=(const id& y) const; 
    bool operator>=(const id& y) const; 

    template<class charT, class traits> 
    friend std::basic_ostream<charT, traits>& 
    operator<<(std::basic_ostream<charT, traits>& os, const id& x); 
}; 
0

La documentation indique qu'il peut être écrit dans un flux. Écrivez-le à un std::ostringstream et hachez le résultat str(). Bien que le format de sortie ne soit pas spécifié, il est unique pour un ID donné et cohérent pour une exécution donnée de votre programme (qui est aussi long que l'ID de thread reste valide de toute façon).

+0

Je ne suis pas sûr au sujet de l'ID du sujet. Je travaille sur une application multi-threads sous Linux (gcc) et puisque l'ordre dans lequel nous créons les threads est cohérent d'une exécution à l'autre, ils ont toujours le même identifiant. Il était réellement utilisé pour que le thread "applicatif" soit de l'id '' 13'' dans 'gdb'. –

+0

Je ne pense pas que ce soit vraiment sûr. –

2

Combien de fils avez-vous? Sauf si vous avez plus de plusieurs centaines, il est peu probable que unordered_map avec un hachage lourd (et le hachage est lourd surtout basé sur std::stringstream) serait plus rapide que std::map. Ne pas forger que std::map a une complexité log avec une constante assez faible.

Et si vous avez des centaines de threads, il y a probablement un problème avec votre application.

1

Pourquoi devriez-vous procéder avec des chaînes? Vous pouvez utiliser

size_t operator()(const boost::thread::id& id) 
{ 
    using boost::hash_value; 

    return hash_value(id); 
} 
+0

A l'époque, je ne pense pas que hash_value ait été implémenté (2010), mais c'est maintenant la bonne réponse. –

Questions connexes