Для этого есть специальное упоминание в C ++ 0x FDIS (n3290).
§ 17.6.5.9 Предотвращение гонки данных
Весь абзац представляет интерес, но более конкретно:
3 / Стандартная библиотечная функция C ++ не должна прямо или косвенно изменять объекты (1.10), доступные для потоков, отличных оттекущий поток, если к объектам нет прямого или косвенного доступа через неконстантные аргументы функции, включая этот.
означает, что вы можете безопасно вызывать cbegin
и cend
на std::vector<T>
.Помимо вызова operator==
или operator<
для std::string
.
6 / Операции над итераторами, получаемые путем вызова стандартного контейнера библиотеки или функции-члена строки, могут получить доступ кбазовый контейнер, но не должен изменять его.
означает, что простая итерация по контейнеру не должна каким-либо образом изменять указанный контейнер.
Несмотря на 3 / хотя, похоже, есть место для глобальных объектов, поскольку итераторы модифицируют некоторый объект общего регистра, в котором они связывают себя с контейнером (функции отладки STL).Я не имею смысла:
7 / Реализации могут делиться своими внутренними объектами между потоками, если объекты не видны пользователям и защищены от гонок данных.
в противном случае.
В любом случае, Стандарт гарантирует, что перебор по vector
будет безопасным ... но не дает никаких гарантий, когда речь идет о фактическом чтении объектов (это вашесвоя).В этом случае это покрыто, потому что std::string
охвачено выше.
РЕДАКТИРОВАТЬ: Как справедливо заметил Дэвид Хаммен, этот Стандарт еще не полностью реализован.Многие компиляторы уже предоставили вышеуказанные гарантии, хотя предыдущий стандарт никогда не говорил о потоках.MSVC, gcc, clang, icc, comeau и т. Д. Все крупные имена уже должны предоставить эту гарантию, как видно из ответа Алса.