Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятки с boost::thread 
V
    Опции темы
boostcoder
Дата 28.1.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.

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

#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;
}


так какой вариант правильный?
PM WWW   Вверх
baldina
Дата 28.1.2011, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



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?
PM MAIL   Вверх
boostcoder
Дата 28.1.2011, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

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

та вот и не понятно...
PM WWW   Вверх
baldina
Дата 28.1.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



я не прав, не оттуда цитата...
Цитата

Код

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

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

то ж другое дело
PM MAIL   Вверх
azesmcar
Дата 28.1.2011, 17:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



boostcoder

boost::thread в отличии от POSIX использует не системные ID-шники а свои внутренние. 
У меня этот код выводит разные значения, но в принципе boost оставляет за собой право использовать заново ID уже завершенных потоков. Попробуй перенести вывод ID основого потока до join()-а, в таком случае оба потока на момент вывода существуют и обязаны быть уникальными.
PM   Вверх
baldina
Дата 28.1.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



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

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

PM MAIL   Вверх
azesmcar
Дата 28.1.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

 smile 
У типа thread::id слишком жесткие требования, чтобы можно было сделать его портируемым используая системные идентификаторы. smile 
PM   Вверх
boostcoder
Дата 28.1.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

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

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

PM WWW   Вверх
boostcoder
Дата 28.1.2011, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



скажите, кому-либо, когда-либо, приходилось использовать ID`ы потоков для чего-то?
PM WWW   Вверх
azesmcar
Дата 28.1.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(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 в глобальном массиве. Можно найти применения при желании.

Это сообщение отредактировал(а) azesmcar - 28.1.2011, 19:38
PM   Вверх
boostcoder
Дата 28.1.2011, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в общем понял. кроме как для отладки, он никакой ценности не представляет.

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

PM WWW   Вверх
azesmcar
Дата 28.1.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

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

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

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


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

я имел ввиду реальный опыт использования. а не возможности)
PM WWW   Вверх
azesmcar
Дата 28.1.2011, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

Ну как сказать? Лично я этого не писал, но если есть пример, то где-то наверняка есть и решение smile 
PM   Вверх
xvr
Дата 31.1.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0872 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.