Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > непонятки с boost::thread


Автор: boostcoder 28.1.2011, 17:02
всем привет.

следующий код:
Код

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

void handler() {
   std::cout << "thread id      = " << boost::this_thread::get_id() << std::endl;
}

int main() {
   boost::thread thread(handler);
   thread.join();

   std::cout << "main thread id = " << boost::this_thread::get_id() << std::endl;

   return 0;
}


выводит в консоль одинаковые ID`ы.

но, к примеру, такой код, выводит разные:
Код


#include <stdio.h>
#include <pthread.h>

void* handler(void*) {
   printf("thread id = %u\n", (unsigned)pthread_self());
   return 0;
}

int main() {
   pthread_t thread;
   pthread_create(&thread, 0, handler, 0);
   pthread_join(thread, 0);

   printf("main id = %u\n", (unsigned)pthread_self());

   return 0;
}



второй вариант мне кажется правильным.

или я чего-то недопонимаю?

спасибо.

Добавлено через 3 минуты и 48 секунд
этот вариант тоже выводит разные ID`ы.
Код

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

void handler() {
   printf("thread id = %u\n", (unsigned)pthread_self());
}

int main() {
   boost::thread thread(handler);
   thread.join();

   printf("main id = %u\n", (unsigned)pthread_self());

   return 0;
}


так какой вариант правильный?

Автор: baldina 28.1.2011, 17:24
boost:
Цитата

If *this refers to a thread of execution, an instance of boost::thread::id that represents that thread. Otherwise returns a default-constructed boost::thread::id.

не получается ли тут default-constructed id?

Автор: boostcoder 28.1.2011, 17:28
я так понял, что boost::this_thread::get_id() возвращает идентификатор контекста в котором объект boost::thread создан.
вот только как получить ID контекста в котором выполняется код(а не в котором живет объект boost::thread)?

Добавлено через 1 минуту и 7 секунд
Цитата(baldina @  28.1.2011,  17:24 Найти цитируемый пост)
не получается ли тут default-constructed id? 

та вот и не понятно...

Автор: baldina 28.1.2011, 17:33
я не прав, не оттуда цитата...
Цитата

Код

namespace this_thread
{
    thread::id get_id();
}

Returns: An instance of boost::thread::id that represents that currently executing thread.

то ж другое дело

Автор: azesmcar 28.1.2011, 17:50
boostcoder

boost::thread в отличии от POSIX использует не системные ID-шники а свои внутренние. 
У меня этот код выводит разные значения, но в принципе boost оставляет за собой право использовать заново ID уже завершенных потоков. Попробуй перенести вывод ID основого потока до join()-а, в таком случае оба потока на момент вывода существуют и обязаны быть уникальными.

Автор: baldina 28.1.2011, 17:57
Цитата(azesmcar @  28.1.2011,  17:50 Найти цитируемый пост)
boost::thread в отличии от POSIX использует не системные ID-шники а свои внутренние. 

ну верно, как описано в boost, единственное назначение id отличить исполняемые потоки. а handler() к тому моменту завершен

Автор: azesmcar 28.1.2011, 17:59
Цитата(baldina @  28.1.2011,  17:57 Найти цитируемый пост)
ну верно, как описано в boost, единственное назначение id отличить исполняемые потоки. а handler() к тому моменту завершен

 smile 
У типа thread::id слишком жесткие требования, чтобы можно было сделать его портируемым используая системные идентификаторы. smile 

Автор: boostcoder 28.1.2011, 18:28
Цитата(azesmcar @  28.1.2011,  17:50 Найти цитируемый пост)
boost::thread в отличии от POSIX использует не системные ID-шники а свои внутренние.

т.е., я так понимаю, что на каждой платформе принцип получения этих ID`ов тоже разный?

Добавлено через 33 секунды
всем спасибо. вопрос закрыт.

Автор: boostcoder 28.1.2011, 19:15
скажите, кому-либо, когда-либо, приходилось использовать ID`ы потоков для чего-то?

Автор: azesmcar 28.1.2011, 19:38
Цитата(boostcoder @  28.1.2011,  18:28 Найти цитируемый пост)
т.е., я так понимаю, что на каждой платформе принцип получения этих ID`ов тоже разный?

нет, так сделано именно для того, чтобы не зависеть от платформы. В POSIX нет никаких гарантий по поводу типа pthread_t, это сильно мешает реализации вывода идентификаторов, сравнению и так далее, потому в boost своя реализация, насколько я знаю это на самом деле обычный адрес.

Цитата(boostcoder @  28.1.2011,  19:15 Найти цитируемый пост)
скажите, кому-либо, когда-либо, приходилось использовать ID`ы потоков для чего-то? 

Для логирования и отладки. Еще приходилось в WinAPI для работы с конкретным потоком, но в boost этот ID ничего не обозначает, он существует лишь для идентификации работающих потоков. Из применений можно например подсчитать хэш для thread::id и таким образом имитировать thread local storage в глобальном массиве. Можно найти применения при желании.

Автор: boostcoder 28.1.2011, 19:43
в общем понял. кроме как для отладки, он никакой ценности не представляет.

еще раз спасибо.

Автор: azesmcar 28.1.2011, 19:49
Цитата(boostcoder @  28.1.2011,  19:43 Найти цитируемый пост)
в общем понял. кроме как для отладки, он никакой ценности не представляет.

Ну почему же, я привел пример.

Цитата(azesmcar @  28.1.2011,  19:38 Найти цитируемый пост)
можно например подсчитать хэш для thread::id и таким образом имитировать thread local storage в глобальном массиве

Да вообще в любой задаче, где нужна идентификация потоков. Можно использовать в реализацию work stealing thread pool-а, так-как там необходим TLS, но также нужна возможность получения доступа к локальным данным другого потока при необходимости. В таком случае глобальный массив с одним элементом для каждого потока ялвяется хорошим решением, никакой синхронизации (во всяком случае со стороны программиста, процессору тут наверняка придеться потрудиться). Хотя в данном случае было бы легче передавать очередной идентификатор потоку в виде аргумента при создании вместо подсчета хэша... в общем сложно однозначно сказать, может и пригодиться.

Автор: boostcoder 28.1.2011, 19:52
Цитата(azesmcar @  28.1.2011,  19:49 Найти цитируемый пост)
Ну почему же, я привел пример.

я имел ввиду реальный опыт использования. а не возможности)

Автор: azesmcar 28.1.2011, 19:53
Цитата(boostcoder @  28.1.2011,  19:52 Найти цитируемый пост)
я имел ввиду реальный опыт использования. а не возможности) 

Ну как сказать? Лично я этого не писал, но если есть пример, то где-то наверняка есть и решение smile 

Автор: xvr 31.1.2011, 14:48
Цитата(boostcoder @  28.1.2011,  19:52 Найти цитируемый пост)
я имел ввиду реальный опыт использования. а не возможности) 
Есть реальный пример (с родными thred id,  а не boost'а, но суть та же)
Есть система, в которой есть главная нить, исполняющая аналог Виндового message loop'а (это не message loop, но суть та же). И есть некий класс (по сути RPC вызов, хотя не совсем RPC но сути это не меняет smile. В этом классе есть метод, который посылает запрос на удаленный сервер и ждет ответ (который приходит по независимому каналу). Так вот, если этот метод вызывается в потоке, отличным от главного, то он может спокойно ожидать ответа, заблокировавшись на event'е, который взведет ответ (из независимого канала). Но если вызов был в основном потоке, то блокироваться нельзя (получится deadlock, т.к. цикл обработки сообщений обрабатывает ВСЕ каналы). В таком случае метод крутит цикл обработки сообщений сам, и ждет установки того же event'а (проверяя его периодически в цикле)

Для проверки - главный поток или не главный поток использовалось сравнение thread ID

Автор: azesmcar 31.1.2011, 14:57
Цитата(xvr @  31.1.2011,  14:48 Найти цитируемый пост)
Есть реальный пример (с родными thred id,  а не boost'а, но суть та же)
Есть система, в которой есть главная нить, исполняющая аналог Виндового message loop'а (это не message loop, но суть та же). И есть некий класс (по сути RPC вызов, хотя не совсем RPC но сути это не меняет .

 smile 
навеяло
Цитата

— Правда ли, что шахматист Петросян выиграл в лотерею тысячу рублей?
— Правда, только не шахматист Петросян, а футболист «Арарата» Акопян, и не тысячу, а десять тысяч, и не рублей, а долларов, и не в лотерею, а в карты, и не выиграл, а проиграл.

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)