Контейнеры и потоки STL (одновременная запись) в Linux - PullRequest
2 голосов
/ 01 ноября 2011

Я ищу оптимальную стратегию для использования контейнеров STL (таких как std :: map и std :: vector) и pthreads.

Какой канонический путь?Простой пример:

std::map<string, vector<string>> myMap;

Как мы можем гарантировать параллелизм?

mutex_lock;
write at myMap;
mutex_unlock;

Кроме того, я хотел бы знать, сталкиваются ли pthreads и STL с проблемами производительности при совместном использовании.

Система: Liunx, g ++, pthreads, без повышения, без Intel TBB

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Стандарт C ++ 03 вообще не говорит о параллелизме, поэтому аспект параллелизма не рассматривается как деталь реализации для компиляторов. Поэтому в документации, прилагаемой к вашему компилятору, нужно искать ответы, связанные с параллелизмом.

Большинство реализаций STL не являются потокобезопасными как таковые.

Поскольку контейнеры STL не обеспечивают явной безопасности потоков, так что да, вам придется использовать собственный механизм синхронизации. И пока вы это делаете, вы должны использовать RAII вместо того, чтобы управлять ресурсом синхронизации (разблокировка мьютекса и т. Д.) Вручную.

Вы можете обратиться к документации здесь:

MSDN:

Если один объект записывается одним потоком, тогда все операции чтения и записи в этот объект в том же или других потоках должны быть защищены. Например, если для объекта A задан поток 1, записывающий данные в A, поток 2 должен быть запрещен для чтения или записи в A.

Документация GCC говорит:
В настоящее время мы используем определение безопасности потоков SGI STL , которое гласит:

Реализация SGL в STL является поточно-ориентированной только в том смысле, что одновременный доступ к отдельным контейнерам является безопасным, а одновременный доступ для чтения к совместно используемым контейнерам безопасен. Если несколько потоков обращаются к одному контейнеру и, по крайней мере, один поток потенциально может писать, то пользователь отвечает за обеспечение взаимного исключения между потоками во время доступа к контейнеру.

Обратите внимание: стандартная библиотека GCC является производной от кода STL SGI.

0 голосов
/ 01 ноября 2011

Вы должны взглянуть на строительные блоки Intel Thread TBB (http://threadingbuildingblocks.org/). У них есть несколько очень оптимизированных структур данных, которые обрабатывают параллелизм внутри, используя неблокирующие стратегии.

0 голосов
/ 01 ноября 2011

Канонический способ обеспечения параллелизма - удержание блокировки при доступе к коллекции.

Это работает в 90% случаев, когда доступ к коллекции в любом случае не критичен для производительности.Если вы получаете доступ к общей коллекции настолько, что ее блокирование снижает производительность, вам следует пересмотреть свой дизайн.(И, скорее всего, ваш дизайн в порядке, и это не повлияет на производительность настолько, насколько вы можете предположить.)

...