실제로 필요한 것은 * nix pthread 식별자 (pthread_t)에 대한 휴대용 비교 및 인쇄입니다. pthread_equal 함수는 두 스레드 ID가 같은지 비교하기 위해 존재하지만 일부 구현에서는 pthread_t가 구조체에 대한 포인터이기 때문에 연산자 < < => => (물론 이식 가능함)과 비교할 수 없습니다. 그래서 공유하고 싶은 솔루션을 발견하고 이식성에 대해 논의했습니다.휴대용 인쇄 및 비교 pthread_t
우리는 thred_id 클래스 래퍼를 가지고 있다고 가정합니다.이 래퍼는 덜 유사하고 동등한 비교 가능하며 물론 인쇄 가능해야합니다. 두 개의 부분 특수화를 사용하여 템플릿 클래스를 만듭니다. 하나는 포인터 용이고 다른 하나는 산술 형용입니다.
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);
하지만 운영자 < 위해 우리는 pthread_t
다음 포인터로 구현됩니다
경우 그래서 여기
hash<pthread_t>::calculate(tid1) < hash<pthread_t>::calculate(tid2)
을 비교하는 해시 사용을 호출 우리 pointed 객체에 대한 해시를 계산합니다.
산술 형이라면 unsigned int로 캐스트하려고합니다.
구조체로 구현되는 경우 구조체 개체 자체에 대한 해시를 계산합니다.
해시 값은 연산자가 적고 스레드 ID 출력에만 사용됩니다.
당신은 어떻게 생각하십니까? 이 솔루션은 얼마나 이식성이 있으며 더 나은 점이 있습니까?
미리 감사드립니다.
본질적으로 주문할 수없는 유형의 주문을 시행하려는 이유는 무엇입니까? 당신은 개념적으로 무엇을 성취하려고합니까? – FooF