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

С++ 11/С++ 03 и std::vector безопасность потоков

Я читаю о безопасности потоков различных контейнеров stl из этой ссылки Теперь я наткнулся на эту точку, которая указывает только на С++ 11

Различные элементы в одном контейнере могут быть изменены одновременно различными потоками, за исключением элементов std::vector<bool>(например, вектор объектов std::future может принимать значения из нескольких потоков)

Означает ли это, если у меня есть такой метод, который используется несколькими потоки одновременно (notice the method does not have any locks)

void ChangeValue(int index , int value)
{
   someVector[index] = value;
}

Является ли вышеуказанный метод безопасным. Я понимаю, что он безопасен только для С++ 11. Однако, когда я смотрю на другое выражение, упомянутое в ссылке

Все функции-члены-константы могут вызываться одновременно разными потоки в одном контейнере. Кроме того, функции-члены begin(), end(), rbegin(), rend(), front(), back(), data(), find(), lower_bound(), upper_bound(), equal_range(), at() и, кроме ассоциативные контейнеры, оператор [], ведут себя как const для целей безопасности потоков (т.е. их также можно вызывать одновременно разные потоки в одном контейнере). В более общем плане, С++ стандартные функции библиотеки не изменяют объекты, кроме тех объектов доступны, прямо или косвенно, через функцию non-const аргументы, включая этот указатель.

Я пришел к выводу, что в С++ 03 вышеупомянутый метод можно безопасно использовать. Пожалуйста, дайте мне знать, правильно ли я понимаю.

4b9b3361

Ответ 1

Не имеет смысла спрашивать, является ли что-то потокобезопасным по стандарту С++ 03 - С++ 03 и ранее не имели понятия о потоках или безопасности потоков.

ChangeValue - это данные без гонок (как определено С++ 11 и более поздними), если ни один из двух потоков не передает один и тот же аргумент для index, либо вызовы, передающие один и тот же аргумент, синхронизируются друг с другом посредством некоторые из них являются внешними по отношению к функции.