Как получить идентификатор потока из boost :: thread? - PullRequest
17 голосов
/ 28 декабря 2010

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

Ответы [ 3 ]

46 голосов
/ 20 июня 2013

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

boost::this_thread::get_id()

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

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

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

9 голосов
/ 28 декабря 2010

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

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

8 голосов
/ 28 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...