STL Map или HashMaps безопасны? - PullRequest
       5

STL Map или HashMaps безопасны?

4 голосов
/ 09 августа 2010

Могу ли я использовать карту или хэш-карту в многопоточной программе без блокировки? то есть они безопасны от потоков?

Я хочу одновременно добавлять и удалять карты.

Кажется, там много противоречивой информации.

Кстати, я использую библиотеку STL, которая поставляется с GCC под Ubuntu 10.04

РЕДАКТИРОВАТЬ: Точно так же, как остальная часть Интернета, я, кажется, получаю противоречивые ответы?

Ответы [ 5 ]

14 голосов
/ 09 августа 2010

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

т.е. Вы не можете изменить контейнер из нескольких потоков. Так что вам нужно использовать lock / rw-lock сделать доступ безопасным.

4 голосов
/ 09 августа 2010

TBB - это бесплатная библиотека с открытым исходным кодом, которая предоставляет потокобезопасные ассоциативные контейнеры. (http://www.threadingbuildingblocks.org/)

4 голосов
/ 09 августа 2010

номер

Честный. Нет.

редактировать

Хорошо, я уточню.

Вы можете иметь любое количество потоков, читающих одну и ту же карту. Это имеет смысл, потому что чтение не имеет побочных эффектов, поэтому не имеет значения, делает ли это кто-то еще.

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

Ваш первоначальный вопрос был о параллельном добавлении и удалении. Поскольку оба они являются записями, ответ на вопрос о том, являются ли они потокобезопасными, - простое, однозначное «нет».

2 голосов
/ 09 августа 2010

Наиболее часто используемая модель для обеспечения безопасности потока контейнеров STL - SGI one:

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

, но, в конце концов, дело за авторами библиотеки STL - AFAIK стандарт ничего не говорит о поточной безопасности STL.

Но в соответствии с документами реализация GNU stdc ++ следует ей (по состоянию на gcc 3.0+), если выполняется ряд условий.

HIH

0 голосов
/ 09 августа 2010

Ответ (как и большинство проблем с многопоточностью) заключается в том, что он будет работать большую часть времени. К сожалению, если вы поймаете карту во время ее изменения, то вы попадете в беду. Так что нет.

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

edit Блокировки Reader-Writer хороши, но то, насколько они лучше стандартного мьютекса, зависит от схемы использования. Я не могу рекомендовать либо, не зная больше. Профилируйте оба и посмотрите, что лучше всего соответствует вашим потребностям.

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