実際に必要なのは、* nix pthread識別子(pthread_t)のポータブルな比較とプリントです。 pthread_equal関数は2つのスレッドIDを比較するために存在しますが、いくつかの実装ではpthread_tが構造体へのポインタであるため、演算子< < => =>(もちろん移植可能です)と比較することはできません。そこで私は、共有したいと思っていたソリューションを見つけ出し、移植性について議論しました。ポータブルプリントと比較pthread_t
私たちはthred_idクラスラッパーを持っているとします。このラッパーは、それほど類似していない、等価比較可能な、もちろん印刷可能である必要があります。私は2つの部分的な特殊化を持つテンプレートクラスを作っています - ポインタ用と算術型用の1つ
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);
}
};
それはどうですか?我々は2つのスレッドIDを比較する必要がある場合、我々は単に
pthread_equal(tid1, tid2);
を呼び出すが、オペレータ<のために我々はpthread_t
が、我々はその後、ポインタとして実装されているのであれば、ここで
を
hash<pthread_t>::calculate(tid1) < hash<pthread_t>::calculate(tid2)
を比較するためにハッシュを使用します指示されたオブジェクトのハッシュを計算します。
算術型の場合は、unsigned intにキャストしようとします。
構造体として実装されている場合は、構造体オブジェクト自体のハッシュを計算します。
ハッシュ値は、オペレータレスとスレッドID出力にのみ使用されます。
あなたはどう思いますか?このソリューションはどのように移植性があり、それ以上のものはありますか?
ありがとうございます。
なぜ本来的に注文不可能な種類の注文を実施したいのですか?あなたは概念的に何を達成しようとしていますか? – FooF