Boost :: this_thread :: get_id () без строковой операции - PullRequest
2 голосов
/ 28 октября 2011

Я нахожусь в ситуации, когда мне нужно получить boost :: thread :: id в переменную, но эта переменная НЕ является строкой, ни строковая операция не допускается. это возможно?

может быть что-то вроде

char *tid = (casting something) boost::this_thread::get_id()

это c ++ в системе Unix. причина, по которой следует избегать использования строковых операций, заключается в том, что они замедляют скорость работы всего приложения. спасибо раньше.

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

В любом случае, ваш вопрос, кажется, полностью основан на неправильном представлении.Если вы хотите получить boost::thread::id в переменную, переменная должна иметь тип boost::thread::id.Вот так:

boost::thread::id MyVariable = boost::thread::get_id();

Строки не задействованы вообще.Почему вы пытаетесь привести его к char *?

Если вашим потокам нужно получать свои идентификаторы так часто, что это создает узкое место, вы, вероятно, делаете что-то ужасно неправильное.Зачем вам так нужен идентификатор потока?

Обновление : Хорошо, вам нужен идентификатор потока с определенной семантикой.Вам необходимо назначить идентификаторов потоков, которые имеют необходимую семантику.(Нет никакой гарантии, что любой идентификатор, который уже есть в потоках, может использоваться в имени файла.) В псевдокоде:

  1. Вызовите get_id.
  2. Найдите идентификатор, который вы получиликарта.
  3. Если вы нашли запись для этого идентификатора, верните ее значение, все готово.
  4. В этой теме нет идентификатора, который можно использовать в имени файла.Так что назначьте это одно.Сохраните пару идентификатора, который вы получили из get_id, и идентификатор, который вы только что присвоили на карте.Это будет гарантировать, что в следующий раз, когда вы попытаетесь получить запись для этого потока, вы получите ту же самую.

В качестве альтернативы, ваша платформа может иметь функцию, обеспечивающую необходимую семантику.Например, в Linux gettid, а в NT GetCurrentThreadId.

4 голосов
/ 28 октября 2011

А как же:

std::ostringstream oss;
oss << boost::thread::get_id();
std::string idAsString = oss.str();

См. Документацию по boost :: thread :: id

Обновление: Поскольку вы уже используете boost, почему бы не использовать:

std::string id = boost::lexical_cast<std::string>(boost::thread::get_id());

Кроме того, поскольку вы делаете это только на начальной скорости, это не должно быть проблемой.

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