В качестве примера рассмотрим std :: map, реализованную с деревом Splay. Такая древовидная структура изменчива и изменяется каждый раз, когда к карте обращаются для чтения. Когда карта const, кто должен гарантировать изоляцию одновременных чтений, зависит ли это от кода пользователя или реализации карты?Параллелизм с const std :: T's
ответ
спрашивающий знает, что если у вас есть темы, которые пишут в коллекцию, пользователь должен управлять синхронизированная блокировка.
Вопрос заключается в том, может ли стандарт гарантировать безопасность потока, если одновременные потоки считывают только коллекцию.
Я не уверен, что старые стандарты C++ имели какие-либо гарантии безопасности потоков с любыми операциями вообще, но новый будет (раздел приведен в комментариях, 23.2.2). Как и сейчас, большинство поставщиков теперь обеспечивают безопасность потоков среди одновременных чтений, несмотря на то, что параллелизм внутри объектов, содержащихся в коллекции, очевидно, должен обрабатываться пользователем.
Точно так же вы могли бы использовать блокировки чтения и записи в коллекции STL.
Это родственный вопрос о переполнении стека:
std::*
не гарантирует безопасность ниток.
Фактически раздел 23.2.2 C++ 11 определяет гарантии гонки данных на стандартных контейнерах. –
ok, я имею в виду C++ 03 – triclosan
прочитал тему ниже:
кажется похож на меня с тем, что вы спрашиваете:
- 1. "std :: string const" по сравнению с "const std :: string"
- 2. оператор std :: string() const?
- 3. Инициализация «const std :: string» из «std :: istringstream»
- 4. Поиск по const std :: map
- 5. std :: vector const elements change
- 6. Const Conversion in std :: pair
- 7. Странное поведение std :: cout с const char *
- 8. C++ const корректность с std :: pair
- 9. Const символ * в STD :: basic_iostream
- 10. C++ const std :: назначение строки
- 11. Как инициализировать const std :: pair?
- 12. Почему const std :: random_device невозможен?
- 13. std :: wstring не работает с оператором [] std :: map <const wchar_t *, const char *>
- 14. Невозможно преобразовать из const TiXmlString в const std :: string &
- 15. Как вернуть const std :: vector <Object * const>?
- 16. std :: upper_bound возвращает const iterator в функции const member
- 17. Partial std :: hash specialization для const и non-const типов
- 18. std :: vector with const указатель на объект const не компилируется
- 19. Какой из них использовать const char [] или const std :: string?
- 20. ошибка: использование удаленной функции 'std :: thread :: thread (const std :: thread &)'
- 21. Std :: vector <struct> to const std :: vector <const struct> *
- 22. Convert std :: vector <const Type*> to const std :: vector <T, A> & Vec
- 23. Почему невозможно связать 'const char *' lvalue с 'const char * const &&?
- 24. std :: ios_base :: ios_base (const std :: ios_base &) является закрытым
- 25. Лучше использовать `static const std :: string` или просто` const std :: string` в методе/функции?
- 26. C++ static const std :: map using std :: make_pair, stoping segfaults
- 27. std :: ios_base :: ios_base (const std :: ios_base) является приватным
- 28. Оператор перегрузки == для const std :: reference_wrapper в std :: unordered_map
- 29. volatile и const volatile std :: tuple и std :: get
- 30. Как нарисовать std :: vector <myClass*> на std :: vector <const myClass * const>?
Я не думаю, что стандарт делает какое-либо заявление о параллельности контейнеров. –
@OliCharlesworth: Это также верно для C++ 11? –
это своего рода дубликат: http://stackoverflow.com/questions/1846186/thread-safety-of-stdmap-for-read-only-operations – CashCow