gpt4 book ai didi

c++ - 可移植打印和比较 pthread_t

转载 作者:行者123 更新时间:2023-11-30 04:36:09 25 4
gpt4 key购买 nike

我真正需要的是 *nix pthread 标识符 (pthread_t) 的可移植比较和打印。存在 pthread_equal 函数来比较两个线程 id 是否相等,但是不可能将它们与运算符 <<= >=> (当然我的意思是可移植的)进行比较,因为在某些实现中 pthread_t 是一个指向结构的指针。所以我找到了解决方案,我想分享并讨论它的可移植性。

假设我们有 thred_id 类包装器,它应该是 less-then-comparable、equality-comparable 并且当然是可打印的。我正在制作具有两个部分特化的模板类 - 一个用于指针,一个用于算术类型

template <typename T, bool A = is_arithmetic<T>::value>
struct hash
{
static unsigned long calculate(T thread_id)
{
return hash<T*, A>::calculate(&thread_id);
}
};

template <typename T>
struct hash<T*, false>
{
static unsigned long calculate(T* thread_id)
{
std::size_t hash = 0;
if (char* data = reinterpret_cast<char*>(thread_id))
{
for (int i = 0; i < sizeof(T); ++i)
{
hash = (hash << 6) ^ (hash >> 26) ^ data[i];
}
}
return hash;
}
};

template <typename T>
struct hash<T, true>
{
static unsigned long calculate(T thread_id)
{
return static_cast<unsigned long>(thread_id);
}
};

那么它是如何工作的。如果我们需要比较两个线程 ID,我们只需调用

pthread_equal(tid1, tid2);

但是对于运算符<我们使用hash来比较

hash<pthread_t>::calculate(tid1) < hash<pthread_t>::calculate(tid2)

所以在这里

如果 pthread_t 被实现为一个指针,那么我们将为指向的对象计算哈希值。

如果它是算术类型,那么我们将尝试将其转换为 unsigned int。

如果它作为一个结构实现——我们将为结构对象本身计算散列。

哈希值将仅用于 operator less 和线程 id 输出。

你怎么看?这个解决方案的可移植性如何?还有比这更好的吗?

先谢谢大家。

最佳答案

而不是尝试比较 pthread_t您可以只封装线程创建并将新线程添加到 map<some_id, pthread_t>生成 id 且唯一的位置。然后你总是通过 id 引用线程,你可以按照你喜欢的方式对它们进行排序、排序和比较。

关于c++ - 可移植打印和比较 pthread_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com