Специфичные для потока данные - почему я не могу просто использовать статическую карту с идентификаторами потоков? - PullRequest
5 голосов
/ 24 января 2012

Читая о потоках POSIX, я натолкнулся на пример данных, специфичных для потока.У меня действительно была одна область путаницы в моем разуме ...

Интерфейс данных, специфичных для потока, выглядит немного неуклюжим, особенно если вы смешиваетесь с необходимостью использования pthread_once, различных инициализаторов и т. Д.

Есть ли причина, по которой я не могу просто использовать статический std :: map, ключом которого является идентификатор pthread_self (), а значение данных содержится во второй части std :: pair?

Я не могу придумать причину, по которой это не сработало бы, если бы оно было заключено в мьютекс, но я не вижу никаких предположений об этом или о чем-то подобном, что смущает меня, учитывая, что это звучит намного проще, чем предоставляемый API.Я знаю, что в многопоточности может быть много уловок-22, поэтому я решил спросить и посмотреть, собираюсь ли я вмешаться ... что-то неприятное?:)

Ответы [ 2 ]

5 голосов
/ 24 января 2012

Я не могу придумать причину, по которой это не сработало бы, если бы оно было заключено в мьютекс

Это само по себе очень веская причина;При правильной реализации вы можете получить доступ к данным вашего потока без , не позволяя другим потокам одновременно создавать или обращаться к ним.

Существует также общая эффективность (постоянный доступ по сравнению с логарифмическим временем, если вы используете std::map), нет гарантии, что pthread_t определен подходящий порядок, и автоматическая очистка вместе со всеми другими ресурсами потока.

Вы можете использовать ключевое слово thread_local в C ++ 11 или boost::thread_specific_ptr, если вам не нравится API Posix.

3 голосов
/ 24 января 2012
  1. pthread специфичные для потока данные существовали до того, как стандартные библиотечные контейнеры
  2. специфичные для потока данные исключают необходимость блокировки и гарантируют, что никакие другие потоки не портятся с данными
  3. Данные очищаются автоматически, когда поток исчезает

Сказав это, ничто не мешает вам использовать собственное решение.Если вы можете быть уверены, что контейнер полностью сконструирован до запуска каких-либо потоков (статическая модель потоков), вам даже не нужен мьютекс.

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