Empecé a utilizar la clase unordered_set
desde el espacio de nombres tr1
para acelerar el acceso contra el STL simple (basado en árbol) map
. Sin embargo, quería almacenar las referencias a los hilos ID en boost (boost::thread::id
), y me di cuenta de que la API de esos identificadores es tan opaca que no se puede obtener claramente un hash de ella.tr1 :: hash para boost :: thread :: id?
Sorprendentemente, impulso implementa partes del tr1
(incluyendo hash
y unordered_set
), pero que no define una clase de hash que es capaz de hash de un ID de hilo.
En cuanto a la documentación de boost::thread::id
me encontré con que los ID de hilo puede ser la salida a una corriente, por lo que mi solución para hacer hash era una especie de:
struct boost_thread_id_hash
{
size_t operator()(boost::thread::id const& id) const
{
std::stringstream ostr;
ostr << id;
std::tr1::hash<std::string> h;
return h(ostr.str());
}
};
es decir, serializarlo, se aplica el hash a la cadena resultante. Sin embargo, esto parece ser menos eficiente que usar el STL map<boost::thread::id>
.
Entonces, mis preguntas: ¿encuentran una forma mejor de hacer esto? ¿Es una incongruencia clara tanto en boost como en tr1 no forzar la existencia de una clase hash<boost::thread::id>
?
Gracias.
+1, y gracias por su respuesta. En realidad, creo que es el mejor de todos, así que lo aceptaré. No estoy seguro de cómo "estándar" 'native_handle' y el relacionado' native_handle_type' sería a largo plazo. Las posibilidades parecen ser que el hash 'thread :: id' podría incluirse en un tiempo razonable en el impulso, ya que hubo algún informe en contra de TR1 por no tenerlo tampoco si recuerdo bien ... En resumen: gracias, no lo hice pensar en 'native_handle_type'. –