<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 реализованы)