2014-12-11 3 views
3

В настоящее время я работаю над созданием приложения на C++ как в Windows, так и в Linux, во время некоторых отладки я обнаружил, чтоИспользование std :: hash <std :: thread :: id>() (std :: this_thread :: get_id())

std::this_thread::get_id().hash() 

не компилируется на Linux с GCC 4.8 (благодаря комментариям в этом thread). Предлагаемое исправление для этого было использовано:

std::hash<std::thread::id>()(std::this_thread::get_id()) 

Кто-нибудь знает, производят ли эти данные одинаковые результаты?

+2

Очевидно, что не на gcc 4.8, так как никто не компилируется. ;) – Yakk

+0

Сколько потоков в вашем процессе, чтобы вы заметили разницу против двоичного дерева? Преждевременная оптимизация - корень всего зла. – Slava

ответ

5

GCC имеет право отклонить код. Стандарт не определяет член hash для std::thread::id. C++ 11, 30.3.1.1:

namespace std { 
    class thread::id { 
    public: 
    id() noexcept; 
    }; 

    bool operator==(thread::id x, thread::id y) noexcept; 
    bool operator!=(thread::id x, thread::id y) noexcept; 
    bool operator<(thread::id x, thread::id y) noexcept; 
    bool operator<=(thread::id x, thread::id y) noexcept; 
    bool operator>(thread::id x, thread::id y) noexcept; 
    bool operator>=(thread::id x, thread::id y) noexcept; 

    template<class charT, class traits> 
    basic_ostream<charT, traits>& 
     operator<< (basic_ostream<charT, traits>& out, thread::id id); 

    // Hash support 
    template <class T> struct hash; 
    template <> struct hash<thread::id>; 
} 

Таким образом, используя std::hash<std::thread::id>()(std::this_thread::get_id()), безусловно, является действительным (фактически единственным действительным) способом получения хэша потока ID.

0

std::thread::id::hash() не соответствует стандарту, насколько я могу судить. Таким образом, это, вероятно, расширение или реализация детали. Таким образом, его поведение, очевидно, будет реализовано.

std::hash<std::thread::id>()(std::this_thread::get_id()) в стандартном исполнении.

Как вы не можете иметь резьбу на более чем одной системы, ни может .hash() быть вызвана в любом портативном коде, остается возможность того, что некоторые платформы специальный модуль использует .hash(), ваш общий код с помощью std::hash. Вы можете полагаться на здравомыслие и предполагать, что .hash() - это то же самое, или вы можете подметать свой платформенный модуль. Я бы пошел с размахом.