Подтвердить что ты не робот

С++ 11 STL контейнеры и безопасность потоков

У меня есть проблема с поиском актуальной информации об этом.

В С++ версии 11 контейнеров STL гарантируется определенный уровень безопасности потоков?

Я ожидаю, что они этого не сделают из-за причин производительности. Но чем снова, почему у нас есть как vector::operator [], так и vector::at.

4b9b3361

Ответ 1

Поскольку существующие ответы не охватывают его (только комментарий), я просто упомянул 23.2.2 [container.requirements.dataraces] текущего стандартная спецификация С++, в которой говорится:

чтобы избежать сбоев данных, когда содержимое содержащегося объекта в разных элементах в одной и той же последовательности, за исключением vector<bool>, изменяется одновременно.

то есть. он безопасен для доступа к отдельным элементам одного и того же контейнера, поэтому, например, вы можете иметь глобальный std::vector<std::future<int>> из десяти элементов и иметь десять потоков, каждый из которых записывается в другой элемент вектора.

Кроме того, те же правила применяются к контейнерам, что и для остальной части стандартной библиотеки (см. 17.6.5.9 [res.on.data.races]), в качестве Mr. C64 answer, а также [container.requirements.dataraces] перечисляет некоторые неконстантные функции-члены контейнеров, которые можно назвать безопасно, потому что они возвращают не-const ссылки на элементы, они фактически ничего не изменяют ( в общем случае любая не-константная функция-член должна рассматриваться как модификация.)

Ответ 2

Я думаю, что контейнеры STL предлагают следующую базовую гарантию безопасности:

  • одновременное чтение одного и того же объекта ОК

  • одновременное чтение/запись различных объектов в порядке

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

Ответ 3

Нет. Проверьте PPL или Intel TBB на поточно-безопасные STL-подобные контейнеры.

Как отмечают другие, у них есть обычная "многопоточная безопасность чтения", но это даже pre С++ 11. Ofc это не означает, что один писатель несколько читателей. Это значит 0 писателей.:)