Как получить идентификатор потока из boost:: thread?

Я хочу иметь возможность идентифицировать потоки простым id при ведении журнала, чтобы было легко отслеживать выполнение одного потока. С помощью окон, использующих API GetCurrentThreadId(), можно добиться того, чего я хочу. В boost::thread существует метод get_id(), но это не представляет собой целочисленное значение, такое как целое число. У этого объекта есть член thread_data, который содержит идентификатор, который, кажется, является тем, что я хочу, но член данных является закрытым, поэтому доступ к нему невозможен.

Каков способ повышения доступа к идентификатору потока для отображения или идентификации?

Ответ 1

Boost включает перегрузку operator<<(std::ostream&, const boost::thread::id&), которая может использоваться для записи идентификатора потока в поток (фактически, перегрузка является шаблоном и будет работать с любой специализацией std::basic_ostream, а не только std::ostream).

Результат печати идентификатора, вероятно, зависит от платформы, поскольку разные платформы могут использовать разные внутренние представления для идентификаторов потоков.

Ответ 2

Слишком поздно, но для пользователей, которые ищут ответ, boost позволяет проконсультироваться с идентификатором потока, как вы сказали, просто называя следующий метод:

boost::this_thread::get_id()

Этот метод возвращает внутренний тип id из boost, который не является числовым, как вы хотите. Но вы можете легко преобразовать это число, например, в unsigned long, учитывая, что id имеет шестнадцатеричное представление. Эта небольшая функция выполнит работу:

#include <boost/lexical_cast.hpp>
#include <boost/thread.hpp>

unsigned long getThreadId(){
    std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id());
    unsigned long threadNumber = 0;
    sscanf(threadId.c_str(), "%lx", &threadNumber);
    return threadNumber;
}

void drawThreadId(){
    std::cout << getThreadId() << std::endl;
    boost::this_thread::sleep(boost::posix_time::milliseconds(500));
}

int main() {
    for(int i=0; i<10; i++){
        boost::thread thread = boost::thread(drawThreadId);
    }
    return 0;
}

Это вернет что-то вроде этого:

4491075584
4491612160
4492148736
4492685312
4493221888
4493758464
4494295040
4494831616
4495368192
4495904768

Не забудьте ссылку с boost_thread и boost_system.

Надеюсь, это поможет!

Ответ 3

Вам нужно использовать функцию-член boost::thread::native_handle(). Он возвращает тип native_handle_type, который является псевдонимом, определенным для реализации, для идентификатора собственного потока, который затем может использоваться с функциями API собственных потоков.