Итерация через STL-карту с помощью итератора различными потоками

У меня есть карта STL, к которой будут доступны два потока. Ни один из них не вставляет и не удаляет элементы: они просто читаются.

Если бы это был простой массив, я уверен, что это никогда не вызовет неприятностей. Однако STL-карта представляет собой сложную структуру данных, реализация которой неизвестна мне. Будет ли это причиной гонки данных?

1 ответ

Стандартные контейнеры С++ (начиная с 2011 года) позволяют безопасный доступ несколькими параллельными считывателями (т.е. через функции const member).

То есть, вы в порядке (предполагая, что функции-члены const для типов, которые вы используете с контейнером, следуют тем же правилам: bitwise- const, за исключением объектов, которые защищены от доступа другими потоками).

Если вы используете старую реализацию, у вас могут возникнуть проблемы, но я сомневаюсь.

Здесь весь фрагмент раздела введения в библиотеку Стандарта (N3337). Я не думаю, что одного из этих абзацев достаточно, чтобы ответить на ваш вопрос, так что вы получите всю свою жизнь!

17.6.5.9 Уклонение от гонки данных <span> [res.on.data.races]</span>

1 В этом разделе указаны требования, которые должны выполняться реализациями для предотвращения данных рас (1.10). Каждая стандартная библиотечная функция должна соответствовать каждому если не указано иное. Реализации могут данных в случаях, отличных от указанных ниже.

2 Стандарт С++ библиотечная функция не должна прямо или косвенно обращаться к объектам (1.10), доступным для потоков, отличных от текущего потока, если только доступ к объектам осуществляется прямо или косвенно через функции аргументы, включая это.

3 Стандартная библиотечная функция С++ не должна прямо или косвенно изменять объекты (1.10), доступные по потокам кроме текущего потока, если только объекты не доступны напрямую или косвенно через функции неконстантных аргументов, включая это.

4 [Примечание: это означает, например, что реализации не могут использовать статический объект для внутренних целей без синхронизации, потому что он может привести к гонке данных даже в программах, которые явно не разделяют объекты между потоками. -end note]

5 Стандартная библиотечная функция С++ не должны обращаться к объектам, косвенно доступным через свои аргументы или через элементы его аргументов контейнера, кроме как путем вызова функций требуемый по его спецификации для этих элементов контейнера.

6 Операции с итераторами, полученные путем вызова стандартной библиотеки контейнер или функция члена строки могут обращаться к базовому контейнер, но не должен изменять его. [Примечание: в частности, контейнер операции, которые недействительны итераторам, конфликтуют с операциями итераторы, связанные с этим контейнером. -end note]

7 Реализации могут совместно использовать собственные внутренние объекты между потоками если объекты не видны пользователям и защищены от данных расы.

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

9 [Примечание. Это позволяет реализациям распараллеливать операции, если нет видимых побочных эффектов. -end note]

licensed under cc by-sa 3.0 with attribution.