【问题标题】:Using pthread_t as a key in map使用 pthread_t 作为 map 中的键
【发布时间】:2016-07-31 12:27:20
【问题描述】:

我想在映射中存储我自己的一个类,键的类型为 pthread_t。(我的类的每个对象都包含一个 pthread_t 数据成员,因此我希望每个实例都与该 pthread_t 作为键相关联, 在地图中) 问题是 pthread_t 无法比较,只能与 pthread_equal 进行比较,所以我不能将它作为键放在地图中。

我见过unordered_map,但是如何实现pthread_t的哈希函数呢?

到目前为止,我一直在考虑使用 pthread_self() 来比较它们,但这也是不可能的,因为返回的值是 pthread_t,而且我不想使用这只是 unsigned long int 的 typedef 的事实。

如果无法使用某种映射,我如何将 pthread_t 的对象存储在容器中并使用 pthread_self() 函数快速找到它们?

【问题讨论】:

  • 为什么不使用矢量?
  • 这可能有点帮助:stackoverflow.com/questions/558469/…
  • @KerrekSB,我现在正在使用向量,但这意味着我必须在 O(n) 中搜索线程,我的问题是是否可以使用 map 或类似的东西更好地搜索.. .
  • @πάνταῥεῖ,我不太明白这篇文章的答案。他们中的一些人假设 pthread_t 是一个 unsigned long int,这是我想避免的。如果我错了,请纠正我,但我从第一个答案中了解到我可以给每个线程一个我可以手动选择的 ID?
  • @dor132 “我可以给每个线程一个我可以手动选择的 ID 吗?” 不幸的是,不能以可移植的方式。其他答案对您想要实现的目标更有用。

标签: c++ linux multithreading pthreads posix


【解决方案1】:

这样它应该可以工作:

bool myCmp(const pthread_t &a, const pthread_t &b)
{
  return memcmp(&a, &b, sizeof(pthread_t)) < 0;
}

map<pthread_t, myDataType, myCmp> myMap;

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2012-01-06
    • 1970-01-01
    • 2011-06-23
    • 2018-11-09
    相关资源
    最近更新 更多