Как я могу использовать boost :: thread :: id как ключ к unordered_map? - PullRequest
3 голосов
/ 17 мая 2010

Согласно документации , boost::thread::id может считаться уникальным для каждого запущенного потока и может использоваться в таких контейнерах, как std::set и std::map (поскольку оператор < переопределен для thread::id).

Моя проблема в том, что я хотел бы использовать thread::id в качестве ключа для boost::unordered_map, однако он требует, чтобы ключ был "хэшируемым" (т. Е. Поддерживает хеширование в size_t). Поскольку все детали реализации thread :: id скрыты, я не думаю, что могу что-либо использовать.

Так что мой вопрос - возможно ли использовать thread :: id в качестве ключа для unordered_map?

Ответы [ 4 ]

5 голосов
/ 17 мая 2010

Вы можете использовать потоковую способность:

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

Маленькая выдержка из класса, чтобы другие могли увидеть, что возможно:

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);
};
2 голосов
/ 03 августа 2015

Зачем вам нужно продолжить со строками? Вы можете использовать

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

    return hash_value(id);
}
2 голосов
/ 17 мая 2010

Сколько у вас потоков? Если у вас не более нескольких сотен, вряд ли unordered_map с тяжелым хешем (а хеш тяжелый, особенно на основе std::stringstream) будет быстрее, чем std::map. Не забывайте, что std::map имеет сложность журнала с довольно маленькой константой.

А если у вас сотни потоков, то, вероятно, проблема в вашем приложении.

0 голосов
/ 17 мая 2010

В документации сказано, что это может быть записано в поток. Запишите его в std::ostringstream и хэшируйте результат str(). Хотя выходной формат не указан, он уникален для данного идентификатора и согласован для данного запуска вашей программы (при условии, что идентификатор потока в любом случае останется действительным).

...