Оба std::thread
потока выполнения, а также исходный main
поток выполнения вызывают различные методы одного и того же объекта std::vector
.
Ни один из методов std::vector
(или любой изметоды контейнеров библиотеки C ++) являются потокобезопасными, поэтому весь доступ к ним из всех потоков выполнения должен быть упорядочен (т. е. защищен мьютексом). Не имеет значения, изменено ли содержимое вектора или нет. begin()
не является поточно-ориентированным. Полная остановка. Etc ...
Добавляя оскорбление к травме, resize()
делает недействительными все существующие итераторы для содержимого std::vector
, поэтому resize()
, выполняемый любым из std::thread
, немедленно аннулируетвсе итераторы одного и того же std::vector
объекта, используемого другими потоками;и, следовательно, все это должно быть упорядочено / заблокировано.
TL; DR: вы должны использовать мьютекс для любого доступа к std::vector
. Изменено ли содержимое вектора конкретным потоком выполнения, или нет, неважно.
PS Вопрос о том, что std::vector
методы не являются потокобезопасными, не зависит от безопасности потока того, что находится ввектор. Если у вас уже есть все итераторы для содержимого вектора, и вы начинаете делать что-то с тем, что находится в векторе, используя существующие итераторы в нескольких потоках выполнения: требуется ли для этого последовательность, зависит от внутренней природы того, что находится в вашем векторе, и еготребования безопасности.