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

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

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


person AJG85    schedule 28.12.2010    source источник


Ответы (3)


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

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

person James McNellis    schedule 28.12.2010
comment
поэтому в качестве параметра функции я бы передал boost::thread::id для использования с оператором выходного потока? Это звучит близко, за исключением того, что, если вы хотите, чтобы значение можно было использовать без потоков или операторов потока? - person AJG85; 28.12.2010
comment
использование boost::this_thread::get_id() из рабочей функции потоков фактически работало с форматированием стиля sprintf_s без необходимости параметра. - person AJG85; 29.12.2010

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

boost::this_thread::get_id()

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

#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.

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

person Alvaro Luis Bustamante    schedule 20.06.2013
comment
Как получить идентификатор из объекта потока? (boost::thread mythread) - person Tomáš Zato - Reinstate Monica; 23.10.2015

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

person Clifford    schedule 28.12.2010
comment
Хотя полезно знать, что все, что мне нужно, это идентификатор потока. Основная причина использования boost::thread заключается в том, чтобы в моем случае избежать вызовов, специфичных для ОС. - person AJG85; 28.12.2010
comment
@ AJG85: ... и nativehandle() предоставит вам точно такой уникальный идентификатор, так в чем проблема? Вам не нужно использовать его ни для чего другого; это было просто объяснение того, что представляет значение; на самом деле это в точности то, что вы получите от GetCurrentThreadId(). Важно отметить, что этот идентификатор будет таким же, как тот, что отображается в окне threads отладчика, поэтому знание его значения может помочь при многопоточной отладке. - person Clifford; 29.12.2010
comment
Хорошая точка зрения. Тот факт, что его можно использовать для собственных вызовов, не означает, что он предназначен только для этого. Также я считаю, что это эквивалентно дескриптору, который вы получите от GetCurrentThread(), в отличие от целочисленного идентификатора, возвращаемого GetCurrentThreadId(). - person AJG85; 29.12.2010
comment
Спасибо за это; возможно, это был не лучший ответ на опубликованный вопрос, но он мне помог =] - person taxilian; 31.05.2012