如何使用boost :: thread :: id作为unordered_map的关键?

时间:2010-05-17 15:01:47

标签: c++ boost multithreading unordered-map

根据documentationboost::thread::id可以被认为是每个正在运行的线程的唯一,并且可以在std::setstd::map等容器中使用(因为{{为<)重写了1}}运算符。

我的问题是我想使用thread::id作为thread::id的密钥,但是它要求密钥是“可散列的”(即支持散列到boost::unordered_map })。由于thread :: id的所有实现细节都被隐藏了,所以我认为没有任何我可以使用的东西。

所以我的问题是 - 是否可以使用thread :: id作为unordered_map的键?

4 个答案:

答案 0 :(得分:5)

您可以使用流媒体功能:

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);
};

答案 1 :(得分:2)

你有多少线程?除非你有超过几百个,否则不太可能 具有大量哈希的unordered_map(并且哈希很重,特别是基于std::stringstream)将比std::map快。不要伪造std::map具有相当小的常数的对数复杂度。

如果您有数百个线程,那么您的应用程序可能存在问题。

答案 2 :(得分:2)

为什么需要继续使用字符串?你可以使用

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

    return hash_value(id);
}

答案 3 :(得分:0)

文档说它可以写入流。将其写入std::ostringstream并散列str()结果。虽然未指定输出格式,但它对于给定的ID是唯一的,并且对于给定的程序运行是唯一的(只要线程ID仍然有效)。