<vector> threadsafe для чтения/записи в разных местах?

Это вопрос начинающего, я думаю, но я не мог найти ответ на этот конкретный вопрос:

У меня есть стандартный (С++) вектор v размера 10 и тип int.

безопасно ли нить изменять все четные позиции (v.at(0) = x; v.at(2) = y и т.д.), и другой поток меняет все значения для нечетных позиций (v.at(1) = a; v.at(3) = b и т.д.) в то же время?

поэтому без изменения размера, без push_back() и т.д. во время жизни этих двух потоков.

если это не безопасно, лучше ли было бы использовать массив?

спасибо за вашу помощь.

Ответ 1

vector не предоставляет никаких гарантий безопасности потоков, поэтому технически ответ будет отрицательным.

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

Ответ 2

От MSDN: Безопасность потоков в стандартной библиотеке С++

Для чтения одного и того же объекта объект является потокобезопасным для чтения:

  • От одного потока в то время, когда нет писателей на других потоках.
  • Из многих потоков в то время, когда нет писателей на других потоках.

Для записи на один и тот же объект объект является потокобезопасным для записи из одного потока, когда никакие читатели на других потоках

Для чтения для разных объектов одного и того же класса объект является потокобезопасным для чтения:

  • От одного потока за раз.
  • От одного потока в то время, когда нет писателей на других потоках.
  • Из нескольких потоков за раз.
  • Из многих потоков в то время, когда нет писателей на других потоках.

Для записи в разные объекты одного и того же класса объект является потокобезопасным для записи:

  • От одного потока, когда нет читателей на других потоках.
  • Из многих потоков.

Итак, из приведенного выше, Теоретически, NO, он не будет потокобезопасным.

Ответ 3

Он зависит от машины. Если у вас есть vector<char>, процессор не сможет загружать v [i] и v [i + 1] отдельными словами. У вас могут быть проблемы с сохранением кеша.

И компилятор, и процессор могут переупорядочить инструкции, которые могут разорвать вашу программу, даже если вышеуказанное не применяется. Вот почему С++ 0x имеет модель памяти.

Ответ 4

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

Ответ 5

Теоретически: Нет.

Практически: Да (Согласно тому, как все хорошо известные STL реализованы)